entity framework和上下文处理

什么时候应该用entity framework调用DbContext.dispose()?

  1. 这个想象的方法不好吗?

    public static string GetName(string userId) { var context = new DomainDbContext(); var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); return userName; } 
  2. 这是否更好?

     public static string GetName(string userId) { string userName; using(var context = new DomainDbContext()) { userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); } return userName; } 
  3. 这是更好的,也就是说,如果使用using()时不应该调用context.Dispose()?

     public static string GetName(string userId) { string userName; using(var context = new DomainDbContext()) { userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); } return userName; } 

其实这是两个问题之一:

  1. 什么时候应该使用Dispose()的上下文?
  2. 我的背景应该是什么样的寿命?

回答:

  1. 从来没有 1 。 在try-finally块中using是一个隐式的Dispose() 。 发生exception时,可能会丢失单独的Dispose语句。 而且,在大多数情况下,根本不调用Dispose (无论是隐式还是显式) 都不是有害的 。

  2. 请参阅entity framework4 – WinForm应用程序中的上下文的生命周期/范围 。 总之:寿命应该是“短”,静态环境是不好的。


1正如一些人所评论的,这个规则的一个例外是当一个上下文是实现IDisposable本身并共享其生命周期的组件的一部分时。 在这种情况下,您可以在组件的Dispose方法中调用context.Dispose()

我跟着一些很好的教程来使用EF,他们不处理上下文。

我对此有点好奇,并且我注意到,即使是备受尊敬的微软VIP也不会处理这种情况。 我发现你不必在正常情况下处理dbContext

如果你想了解更多的信息,你可以阅读这个博客文章 ,总结为什么。

更好的是:

 public static string GetName(string userId) { using (var context = new DomainDbContext()) { return context.UserNameItems.FirstOrDefault(x => x.UserId == userId); } } 

不需要返回using范围之外的结果; 只要立即返回,你仍然会得到理想的处置行为。

您可以将数据库上下文定义为类字段,并实现IDisposable 。 如下所示:

 public class MyCoolDBManager : IDisposable { // Define the context here. private DomainDbContext _db; // Constructor. public MyCoolDBManager() { // Create a new instance of the context. _db = new DomainDbContext(); } // Your method. public string GetName(string userId) { string userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); return userName; } // Implement dispose method. // NOTE: It is better to follow the Dispose pattern. public void Dispose() { _db.dispose(); _db = null; } } 

我会使用选项3; 使用using()会自动为你处理上下文。 选项2是不好的。 选项1也可以,但选项3似乎更具可读性。