我一直在阅读很多文章,解释如何设置实体框架,DbContext以便每个HTTP Web请求只使用各种DI框架创建和使用一个.
为什么这首先是一个好主意?使用这种方法有什么好处?在某些情况下这是个好主意吗?在使用DbContext存储库方法调用实例化s 时,您是否可以使用此技术执行某些操作?
我正在为应用程序编写数据访问层.访问层广泛使用linq类来返回数据.目前,为了将数据反映回数据库,我添加了一个私有数据上下文成员和一个公共保存方法.代码看起来像这样:
private DataContext myDb;
public static MyClass GetMyClassById(int id)
{
DataContext db = new DataContext();
MyClass result = (from item in db.MyClasss
where item.id == id
select item).Single();
result.myDb = db;
return result;
}
public void Save()
{
db.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
这是一个粗略的过度简化,但它给出了一般的想法.有没有更好的方法来处理这种模式?每次我想访问数据库时,我是否应该实例化新的数据上下文?
我已经看到了程序员在代码中创建实体上下文时所采用的两种不同方式.
第一个是这样的,你可以在MSDN代码示例中找到它:
public void DoSomething() {
using (TaxableEducationEntities context = new TaxableEducationEntities()) {
// business logic and whatever else
}
}
Run Code Online (Sandbox Code Playgroud)
第二种是在一些封装了业务逻辑的类中将上下文创建为私有属性.所以你会有类似的东西:
public class Education_LINQ {
private TaxableEducationEntities context = new TaxableEducationEntities();
public void DoSomething() {
var result = from a in context.luAction
select a;
// business logic and whatever else
}
}
Run Code Online (Sandbox Code Playgroud)
哪种方式更有效?
假设您有两个方法,一个名为DoSomething1(),另一个名为DoSomething2(),两个方法都包含using语句来打开上下文并对其执行任何操作.你是否一个接一个地调用一个方法,是否会有任何多余的开销,因为基本上两个方法都创建了上下文,然后在它们完成后清理它?而不是只有一个私有属性在实例化类对象时创建,然后在对象超出范围时进行清理?
我想将dbContext的生命周期与会话的生命周期联系起来,例如 - 能够在多个请求上提交或放弃对dbcontext上的一组突变的更改.
有没有其他(更好?)方法来实现这一目标?如果不是,那么创建和处理上下文的合适机制是什么?我正在考虑在会话结束时使用清理的静态哈希表,但也许我正在做它所有错误.我也在考虑只关注那些必须在多个请求上工作的上下文,并保持其余的每个操作的想法.有什么建议?
管理EntityContext生命周期有很多问题,
我得出的结论是,实体上下文应该被视为一个工作单元,因此不能重复使用.大.
但是在进行一些加速我的数据库访问的研究时,我遇到了这篇博文...
该帖子称,EF文件表现不佳相对于其他框架往往是由于EntityConnection对象被每一个新的时间创建的EntityContext需要的对象.
为了测试这一点,我在Global.asax.cs Application_Start()中手动创建了一个静态EntityConnection .
然后我使用语句将我的所有上下文转换为
using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
....
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,到目前为止,这似乎已经加快了一点点没有任何错误.
但这样安全吗?
使用应用程序范围的静态EntityConnection是否会引入竞争条件?
最好的问候,凯文
我需要我的linq to sql datacontext在我的业务/数据层可用,以便我的所有存储库对象都可以访问.但是,由于这是一个Web应用程序,我想根据请求创建并销毁它.我想知道是否有一个可以懒惰创建并将datacontext附加到当前HttpContext的单例类可以工作.我的问题是:当请求结束时,datacontext会自动处理吗?以下是我正在思考的代码.这是否达到了我的目的:拥有一个可以延迟使用的线程安全的datacontext实例,并在请求结束时自动处理?
public class SingletonDC
{
public static NorthwindDataContext Default
{
get
{
NorthwindDataContext defaultInstance = (NorthwindDataContext)System.Web.HttpContext.Current.Items["datacontext"];
if (defaultInstance == null)
{
defaultInstance = new NorthwindDataContext();
System.Web.HttpContext.Current.Items.Add("datacontext", defaultInstance);
}
return defaultInstance;
}
}
}
Run Code Online (Sandbox Code Playgroud)