無法在使用Effort框架的單元測試中使用現有數據庫

c# effort entity-framework entity-framework-6 unit-testing

我正在嘗試使用Azure SQL中託管的數據庫和Entity Framework 6上的Effort框架編寫測試。

執行以下代碼時,拋出異常:

[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
    EffortProviderConfiguration.RegisterProvider();
}

[TestMethod]
public void TestMethod1()
{
    const string connectionString = "Data Source=***;Initial Catalog=my_catalog;User ID=user;Password=password;provider=System.Data.SqlClient";
    IDataLoader loader = new EntityDataLoader(connectionString);
    using (var ctx = new UsersDbContext(Effort.DbConnectionFactory.CreatePersistent("cool", loader)))
    {
        var usersCount = ctx.Users.Count();
    }
}

Count()執行中拋出的異常:

Effort.Exceptions.EffortException:嘗試初始化'Table'表的內容時出現未處理的異常---> System.ArgumentException:不支持關鍵字:'data source'。

使用app.config設置替換EffortProviderConfiguration.RegisterProvider() ,拋出相同的異常。

當使用完全相同的連接字符串來創建UsersDbContext它會成功並且可以訪問數據。此外,使用Effort持久或臨時模式創建上下文,沒有連接字符串,也可以很好地工作。

如何使用真實數據庫中的現有數據初始化連接?

熱門答案

如果像我一樣,你很困惑為什麼你必須給Effort一個連接字符串(因為它在內存數據庫中工作,你直接為你的上下文提供連接), 文檔使它更清晰 - 它是僅當您使用實體框架的數據庫優先或模型優先變體時才需要,因為實體連接字符串提供了Effort定位模型所需的信息,以便它可以從中構建模式!因此,您可以安全地使用虛擬名稱填充連接字符串的服務器/數據庫/用戶ID /密碼部分。

這也清楚地表明自定義默認DbConnectionFactory方法僅適用於代碼優先,這解釋了我得到的前幾個小時的錯誤...對於模型優先或數據庫優先,您必須將實體連接注入實體類,如這裡所述。

一個有用的提示 - 因為生成的實體模型類是一個部分類,你可以在同一個程序集中創建另一個代碼文件,給它相同的命名空間,並使它也是一個部分類,你可以添加設置它所需的第二個構造函數相反,EntityConnection到該代碼文件,當您修改/重新創建實體模型時,具有自定義構造函數的代碼將不會被t4模板刪除。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因