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
打开连接
我正在努力将我公司的一个项目升级到更新版本的 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