Entity framework 与 Unity "The underlying provider failed on Open."

Entity framework with Unity "The underlying provider failed on Open."

我正在努力将我公司的一个项目升级到更新版本的 MVC、Entity Framework 和 Unity。大部分工作已经完成,但是,从数据库加载数据时我确实遇到了这个问题。这不会发生在每个请求上,并且大多数应用程序都能正常运行。当有几个并发调用时,应用程序调用 API 会出现问题。

我尝试将 Unity 容器的 LifeTimeManager 切换为不同的类型,结果不同(none 实际上解决了问题)。

这是我的 DataContext class

    public class DataContext : IUnitOfWork, IRepositoryFactory
    {
        private const string CONSTRING = "CONSTRING";
        private static volatile DbContext dbContext = new DbContext(CONSTRING);

        private static volatile ConcurrentBag<object> repositories = new ConcurrentBag<object>();

        public DbContext DbContext => dbContext;

        public DataContext()
        {
            Database.SetInitializer<DbContext>(null);
        }

        public void SaveChanges()
        {
            dbContext.SaveChanges();
        }

        public void Dispose()
        {
            dbContext.Dispose();
        }

        public IRepository<T> CreateRepositoryFor<T>() where T : class, IEntity
        {

            var reposType = typeof(Repository<T>);

            var repos = (IRepository<T>)repositories.FirstOrDefault(r => r.GetType() == reposType);

            if (repos == null)
            {
                repos = new Repository<T>(dbContext.Set<T>());


                repositories.Add(repos);
            }

            return repos;
        }

    }

这是我的 UnityConfig

    public class UnityConfig
    {
        #region Unity Container
        private static readonly Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        });

        /// <summary>
        /// Configured Unity Container.
        /// </summary>
        public static IUnityContainer Container => container.Value;
        #endregion

        public static void RegisterTypes(IUnityContainer container)
        {
            RegisterDependencies(container);

            System.Web.Mvc.DependencyResolver.SetResolver(new UnityDependencyResolverAdapter(container));
            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        }

        private static void RegisterDependencies(IUnityContainer unityContainer)
        {
            RegisterDataContextAndUnitOfWork(unityContainer);
            RegisterRepositories(unityContainer);
        }

        private static void RegisterDataContextAndUnitOfWork(IUnityContainer container)
        {
            container.RegisterType<IUnitOfWork, DataContext>(new ContainerControlledLifetimeManager());
            container.RegisterType<IRepositoryFactory, DataContext>(new ContainerControlledLifetimeManager());
            container.RegisterType<IChangeTracker, DataContext>(new ContainerControlledLifetimeManager());
            container.RegisterType(typeof (ICrudService<>), typeof (GenericCrudService<>));

        }

        private static void RegisterRepositories(IUnityContainer container)
        {
            // Haal MethodInfo op zodat we at runtime de static RegisterRepository<T> kunnen aanroepen
            var registerRepositoryMethodName = MemberNameHelper.GetActionName(() => RegisterRepository<IEntity>(container));
            var registerRepositoryMethodInfo = typeof(UnityConfig).GetMethod(registerRepositoryMethodName, BindingFlags.NonPublic | BindingFlags.Static);

            // Registreer een repository voor iedere IEntity class in Domain project
            foreach (var entityType in typeof(IEntity).Assembly.GetTypes().Where(t => typeof(IEntity).IsAssignableFrom(t)))
            {
                var registerRepositoryMethod = registerRepositoryMethodInfo.MakeGenericMethod(entityType);
                registerRepositoryMethod.Invoke(null, new object[] { container });
            }
        }

        private static void RegisterRepository<T>(IUnityContainer unityContainer) where T : class, IEntity
        {
            unityContainer.RegisterFactory<IRepository<T>>(
                factory => factory.Resolve<IRepositoryFactory>().CreateRepositoryFor<T>(),
                new ContainerControlledLifetimeManager()
            );
        }
    }

连接字符串是:Data Source=LOCALHOST;Initial Catalog=Database;Integrated Security=true;MultipleActiveResultSets=True

错误信息是:The underlying provider failed on Open.

在初始化 dbContext 变量后调用 dbContext.Connection.Open(); 方法。这将为 EF

打开连接