[英]Entity Framework giving exception : “The underlying provider failed on Open.”
[英]Entity framework with Unity “The underlying provider failed on Open.”
我正在努力将我的公司项目之一升级到新版本的 MVC、Entity Framework 和 Unity。 大部分工作已经完成,但是从数据库加载数据时我确实遇到了这个问题。 这不会发生在每个请求上,并且大多数应用程序功能正常。 当有几个并发调用时,应用程序执行的 API 调用会出现此问题。
我尝试将 Unity 容器的 LifeTimeManager 切换为不同类型,但结果不同(它们都没有真正解决问题)。
这是我的数据上下文 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.Connection.Open();
初始化dbContext
变量后的方法。 这将为 EF 打开连接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.