entity framework和上下文处理
什么时候应该用entity framework调用DbContext.dispose()?
-
这个想象的方法不好吗?
public static string GetName(string userId) { var context = new DomainDbContext(); var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); return userName; }
-
这是否更好?
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; }
-
这是更好的,也就是说,如果使用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; }
其实这是两个问题之一:
- 什么时候应该使用
Dispose()
的上下文? - 我的背景应该是什么样的寿命?
回答:
-
从来没有 1 。 在
try-finally
块中using
是一个隐式的Dispose()
。 发生exception时,可能会丢失单独的Dispose
语句。 而且,在大多数情况下,根本不调用Dispose
(无论是隐式还是显式) 都不是有害的 。 -
请参阅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似乎更具可读性。