2016-10-14 41 views
0

我正在使用与Unity一起使用的MVC应用程序来注册我的项目的所有依赖关系。我也使用DAL的实体框架。 在我的本地机器中,应用程序运行良好,但是在我部署到服务器上时,Unity在尝试解析依赖关系时收到错误消息。底层提供程序在当时打开失败Unity解决依赖关系

底层提供程序在打开时失败。 ...在异常时,容器是:从IClass映射的解析类...调用MyDbContext的构造函数(System.String connectionName)

1-这是否与连接字符串结构有关系?

贝娄是我的连接字符串

<add name="DBConnection" connectionString="Server=MyServer;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" /> 

此时此刻我没有访问DB以检查IIS用户在服务器上的权限运行的任何查询,但假如它不't,这与Unity在尝试解析连接字符串时的错误有任何关系吗?

2- Unity尝试解析DBContext时尝试打开与DB的连接吗?

这里是我很注入参数

var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString; 

container.RegisterType<IUnitOfWork, MyDbContext>(
       Activator.CreateInstance<T>(), 
       new InjectionConstructor(connectionString)); 
+1

异常可能包含你需要解决这个问题的一切,但你只看顶级消息。抓住它,调用ToString,然后保存在某个地方。这将捕获包括内部例外在内的全部细节。 – Will

+0

我会说最重要的是 - 不要在构造函数中打开SQL连接。任何对数据库的访问应该使用延迟加载,设置DI是关键基础设施的一部分(不应该有IO操作)。 –

+0

这是最后一个异常,我也注册在服务器上的EventViewer – Heinrich

回答

0

您的问题是最有可能依赖于这样一个事实:生产应用程序池标识不具有访问数据库。一旦需要,Unity会创建所有相关类的实例。所以如果你的类需要IUnitOfWork,团结会尝试实例化MyDbContext。

让我指出你不应该首先将实体上下文(MyDbContext)的实例注册为单例 - 实体框架上下文不是线程安全的(Entity Framework Thread Safety),DI也是关键基础结构的一部分T为IO要求 - 如打开可能出错的DB)

而是使用类似

public interface IEntityContextProvider { 
    public MyDbContext CreateContext(); 
} 
public class EntityContextProvider : IEntityContextProvider { 
    public MyDbContext CreateContext() { 
    return new MyDbContext("ef connection string"); 
    } 
} 

用法:

public class SomeClassUsingEF { 
    // DI 
    private readonly IEntityContextProvider _entityContextProvider; 
    // DI 
    public SomeClassUsingEF(IEntityContextProvider entityContextProvider) 
    { 
    if (entityContextProvider == null) 
     throw new ArgumentNullException(nameof(entityContextProvider)); 
    _entityContextProvider = entityContextProvider; 
    } 

    public void SomeQueryToDB() { 
    using(var context = _entityContextProvider.CreateContext()) { 
     // select/insert/updates here 
    } 
    } 
} 

你也连接字符串看起来很像“普通”连接字符串 - 即连接字符串数据库wout实体框架 - 我错过了它的元数据。代码明智的它通常像

private string GetEFConnectionString() 
{ 
    string providerName = "System.Data.SqlClient"; 
    string serverName = @".\SQL2008"; 
    string databaseName = "my-db"; 

    // Initialize the connection string builder for the 
    // underlying provider. 
    var sqlBuilder = new SqlConnectionStringBuilder(); 

    // Set the properties for the data source. 
    sqlBuilder.DataSource = serverName; 
    sqlBuilder.InitialCatalog = databaseName; 
    sqlBuilder.IntegratedSecurity = true; 

    // Build the SqlConnection connection string. 
    string providerString = sqlBuilder.ToString(); 

    // Initialize the EntityConnectionStringBuilder. 
    var entityBuilder = new EntityConnectionStringBuilder(); 

    // Set the provider name. 
    entityBuilder.Provider = providerName; 

    // Set the provider-specific connection string. 
    entityBuilder.ProviderConnectionString = providerString; 

    // Set the Metadata location. 
    entityBuilder.Metadata = @"res://*/Model.csdl| 
     res://*/Model.ssdl| 
     res://*/Model.msl"; 
    return entityBuilder.ToString(); 
} 
+0

授予IIS上的权限后,它工作,看起来像Unity当它解决DBContext坪数据库和用户没有在那里注册。 – Heinrich

相关问题