我正在开发一个使用 Entity Framework 6、ODP.NET、Oracle Managed Driver for Entity Framework 和 Oracle 数据库的新应用程序。
我所看到的是,如果在使用 DbContext 时抛出异常,它似乎没有正确处理连接或上下文。
我正在使用 TDD 设计,我断开连接的呼叫包含在存储库类中。我正在使用以下语句包装我的 DbContext 调用:
public class ProductDbRepository : IProductDbRepository
{
public ProductDbRepository() { }
public List<IProduct> GetAll()
{
IQueryable<Product> query;
List<IProduct> list = new List<IProduct>();
using (var db = new MainContext())
{
query = db.Products;
foreach (var item in query)
{
list.Add(item);
}
}
return list;
}
}
主上下文:
internal class MainContext : DbContext
{
internal MainContext() : base("name=OracleDbContext") { }
public virtual DbSet<Country> Countries { get; set; }
public virtual DbSet<Product> Products { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MainContext>(null);
base.OnModelCreating(modelBuilder);
}
}
如果在诸如 foreach 循环之类的 using 语句中引发异常,然后对使用 DbConext 的其他存储库的后续请求,我将看到此错误:
创建模型时不能使用上下文。如果在 OnModelCreating 方法中使用上下文,或者多个线程同时访问同一个上下文实例,则可能会引发此异常。请注意,不保证 DbContext 和相关类的实例成员是线程安全的。"、
"ExceptionType": "System.InvalidOperationException"、"StackTrace": " at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()\r \n 在 System.Data.Entity.Internal.InternalContext.Initialize()\r\n 在 System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)\r\n 在 System.Data.Entity.Internal.Linq .InternalSet1.Initialize()\r\n at System.Data.Entity.Internal.Linq.InternalSet
1.GetEnumerator()\r\n
在 System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()\r\n
要解决这个问题,我必须停止调试和 IIS Express。过去在 SQL Server 和 EF5 中使用 EF 时,我从未见过这种情况。
我的问题是:如果在使用 DbContext 时抛出异常时我应该做更多工作以确保正确关闭 DbContext 和连接?