2016-10-14 64 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

相關問題