在多线程服务器中使用实体框架的最佳实践是什么?我正在使用实体框架ObjectContext来管理我的所有数据库操作,现在我知道这个上下文不是线程安全的,所以现在当我需要使用它来执行一些数据库操作时,我用lock声明来包围它是安全的.这是我应该怎么做的?
我想使用ExecuteStoreQueryEntity Framework的功能,我想知道我的上下文变量没有ExecuteStoreQuery方法.
所以,我发现它是一种ObjectContext类的方法,但我已经用于DbContext我的应用程序了.我根本就试图改变DbContext用ObjectContext,但它带来了一些错误(例如,在ObjectContext的不是OnModelCreating方法).
我如何使用ExecuteStoreQueryDbContext,如果我不能,是ExecuteStoreQueryDbContext的任何替代品?
我开始在任何地方看到上下文.在ASP.NET MVC中,有ControllerContexts,RequestContexts,HttpContexts,FormContexts.在Entity Framework中,您有ObjectContexts和DbContexts.Ninject有Ninject.Activation.IContext.
什么是背景?
asp.net-mvc httpcontext controllercontext objectcontext dbcontext
如果使用对象上下文数据模型(使用EDMX文件),则在创建期间可能需要在配置文件中指定连接字符串.
遗憾的是,连接字符串不是公共连接字符串,因为它包含实体连接所需的一些内容.MySql连接示例:
<add name="MyDbEntities" connectionString="metadata=res://*/Namespace.MyDb.csdl|res://*/Namespace.MyDb.ssdl|res://*/Namespace.MyDb.msl;provider=MySql.Data.MySqlClient;provider connection string="server=172.17.17.154;User Id=user;password=password;Persist Security Info=True;database=MyDatabase;Convert Zero Datetime=true"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是此连接字符串包含参数"provider connection string"中提供程序的连接字符串.
出于特定原因,我需要创建一个与实体模型无关的新MySqlConnection.为了创建MySqlConnection,我需要为它提供mysql连接字符串 - 这是实体模型的提供者连接字符串,我知道我需要的连接字符串始终是实体模型的相同连接字符串.
但是如何获得提供程序连接字符串programmaticaly?我被困在浏览模型实例但没有成功......
下列:
ModelInstance.Connection.ConnectionString
Run Code Online (Sandbox Code Playgroud)
包含类似"name = TestBotEntities"的内容,甚至不包括整个连接字符串.所以我尝试过:
ConfigurationManager.ConnectionStrings["MyDbEntities"].ConnectionString
Run Code Online (Sandbox Code Playgroud)
但那个包含整个实体连接字符串,我只是不知道如何解析它,如何只从它获取提供者连接字符串.
我正在使用DbContext基于Generic Repositories和Unit of Work设计模式创建的代码中的类.(我在这里遵循指导.)在这个项目上工作时,我遇到了这个ObjectContext课程.
我读过相当数量的讨论帖子ObjectContext对DbContext.虽然我读过的一些内容是有道理的,但我仍然没有完全理解这些差异,这让我对我当前的实现感到疑惑.我应该使用DbContext,ObjectContext还是两者兼而有之?使用其中一个现在被认为是反模式?
好吧,我显然遗漏了一些非常基本的东西.我是Entity Framework的新手.
我想调用存储过程而不导入它们,所以我打算使用ExecuteStoreQuery().根据文档,ExecuteStoreQuery是ObjectContext的一种方法.但是,我不知道从哪里获取我的ObjectContext.
我使用Database First生成了我的entites.到目前为止,我一直在访问我的实体,如下所示:
var db = new MyEntities();
PRODUCT p = db.PRODUCTS.First(a => a.PRODUCTSKEY == thekey);
Run Code Online (Sandbox Code Playgroud)
但是我不能调用db.ExecuteStoreQuery,因为db不是ObjectContext.
我已经用Google搜索了如何从实体获取ObjectContext.我找到了一些答案,但是他们都被警告,并说这是一种解决方法,只有在没有其他选择时才使用它.好的,那么正确的方法是什么?
我发现使用ExecuteStoreQuery的所有示例都假设您已经拥有了ObjectContext.不是很有帮助.
我发现一个网站声明ObjectContext是由Entity Framework"自动生成"的.如果是这样,那么它在哪里?
我显然在这里遗漏了一些非常简单的东西.这不是那么困难.
我们正在从db加载数据:
var somethings = Context.SomethingSet.ToList();
Run Code Online (Sandbox Code Playgroud)
然后有人删除或添加上下文之外的行.Out上下文仍然有缓存已删除的对象,因为它不知道它们已被删除.即使我调用Context.SomethingSet.ToList(),我们的上下文仍包含已删除的对象,导航属性也不正确.
从数据库刷新整个集合的最佳方法是什么?
我首先遵循数据库方法; 我在SQL Server 2008数据库中创建了表,然后使用ADO.NET实体数据模型将这些表映射到Entity Framework类.但是当我打开designer.cs文件时,我在自定义的类定义中找到了以下代码:
public partial class PortalEntities : ObjectContext
Run Code Online (Sandbox Code Playgroud)
所以我有以下三个让我困惑的问题:
为什么我的PortalEntities班级来自ObjectContext而不是DbContext我期望的?
ObjectContext&之间是否存在重大差异DbContext,或者它们主要相同并提供相同的功能
当我尝试编写类似于以下代码的内容时:
Student student = db.Students.Find(id);
Run Code Online (Sandbox Code Playgroud)我发现我不能使用.Find(),因为我曾经用做方法DbContext,那么,这是否意味着,ObjectContext与DbContext有,我可以用不同的方法?
BR
asp.net entity-framework objectcontext asp.net-mvc-3 dbcontext
我已经被这个问题困住了一个多星期了.希望有人能指出我正确的方向.
我首先简要介绍一下我的架构.
资产1 ---> 1地址* - > 1区* - > 1区* - > 1国家
套餐1 - >*资产
使用自我跟踪实体(STE)+ WCF.
脚步:
在步骤2中,呼叫使用预先加载的地址.
from p in context.Assets.Include("Address.Area.Region.Country")
Run Code Online (Sandbox Code Playgroud)
这是尝试呼叫时的错误
context.Packages.ApplyChanges(package)
Run Code Online (Sandbox Code Playgroud)
AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突.在调用AcceptChanges之前,请确保键值是唯一的.
编辑
在窥探之后,我发现这是一个STE问题.问题是您无法持久存储包含此处概述的同一实体的多个实例的图形.这是我的问题.
如何将实体添加到我的实体集合中.新实体可能具有包含与集合中已有密钥相同的密钥的相关实体.即添加可能包含相同地址,区域,地区或国家/地区实体的新资产.
这是我的约束:
我知道Diego B Vega建议的可能解决方案,但这些不是我可以用于我的解决方案的选项.有没有人有任何其他想法?
假设你有这样的代码.
using (CustomerContext db = new CustomerContext())
{
var foundCustList=db.Customers.Where(c=>c.State=='-1').ToList();//Find all the customer which State is -1
foreach(var c in foundCustList)
{
db.DeleteObject(c);
}
db.SaveChanges();//After all the customer is deleted, Commit.
}
Run Code Online (Sandbox Code Playgroud)
但我想知道有没有办法轻松删除对象列表?我不想foreach一个接一个地使用它来做列表.谢谢.
objectcontext ×10
c# ×4
dbcontext ×4
.net ×2
asp.net ×1
asp.net-mvc ×1
database ×1
edmx ×1
httpcontext ×1
linq ×1
wcf ×1