我想基於實體框架6啟用我的DbContext
的單元測試。我已經使用數據庫第一種方法創建了我的DbContext
和我的模型,現在有了一個.edmx設計器文件。
我自動創建的DbContext
確實覆蓋了DbContext.OnModelCreating
方法,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
我試圖根據本文的信息在我的DbContext
數據訪問服務中創建我的DbContext
的新實例。我的代碼沒有遇到Database.SetInitializer;
就像這篇博文的作者所指出的那樣。我的構造函數看起來很像他的。我的DbContext
初始化如下所示:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
在到達前面提到的重寫的OnModelCreating
時會導致異常
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: '上下文在Code First模式下使用,代碼是從EDMX文件生成的,用於Database First或Model First開發。這將無法正常工作。要解決此問題,請不要刪除引發此異常的代碼行。如果您希望使用Database First或Model First,請確保Entity Framework連接字符串包含在啟動項目的app.config或web.config中。如果要創建自己的DbConnection,請確保它是EntityConnection而不是其他類型的DbConnection,並將其傳遞給採用DbConnection的基本DbContext構造函數之一。要了解有關Code First,Database First和Model First的更多信息,請參閱此處的Entity Framework文檔: http : //go.microsoft.com/fwlink/?LinkId = 394715 '
有關stackoverflow的大量問題,在使用數據庫優先的apporach時會集中精力進行單元測試,但似乎沒有人像我一樣有類似的問題。
如何創建和使用內存數據庫(努力)?
附加信息
當我取消註釋OnModelCreating()
,在第一次訪問DataContext時將拋出異常。例如:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
System.Data.Entity.ModelConfiguration.ModelValidationException: '在模型生成期間檢測到一個或多個驗證錯誤:MyApplication.Shared.Model.KeyValuePair :: EntityType'KeyValuePair'沒有定義鍵。定義此EntityType的鍵。 KeyValuePairs:EntityType:EntitySet'KeyValuePairs'基於類型'KeyValuePair',沒有定義鍵。
問題是我必須為KeyValuePair數據集指定密鑰。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
base.OnModelCreating(modelBuilder, null);
}