0

我正在开发一个使用 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 .InternalSet 1.Initialize()\r\n at System.Data.Entity.Internal.Linq.InternalSet1.GetEnumerator()\r\n
在 System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()\r\n

要解决这个问题,我必须停止调试和 IIS Express。过去在 SQL Server 和 EF5 中使用 EF 时,我从未见过这种情况。

我的问题是:如果在使用 DbContext 时抛出异常时我应该做更多工作以确保正确关闭 DbContext 和连接?

4

0 回答 0