エンティティフレームワーク6に基づいて私のDbContext
単体テストを有効にしたいと思います。データベースの最初のアプローチでDbContext
とモデルを作成し、 .edmxデザイナファイルを作成しました。
私の自動的に作成されたDbContext
は、 DbContext.OnModelCreating
ようにDbContext.OnModelCreating
メソッドをオーバーライドします。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
私はこの記事の情報に基づいて私のDbContext
データアクセスサービスで私のDbContext
新しいインスタンスを作成しようとしています。私のコードはDatabase.SetInitializer;
実行されませんDatabase.SetInitializer;
このブログ記事の著者のように指摘した。私のコンストラクタは、彼とまったく同じです。私のDbContext
初期化は次のようになります:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
前述のオーバーライドされたOnModelCreating
に到達すると、次の例外が発生します
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'データベースファーストまたはモデルファースト開発のEDMXファイルから生成されたコードで、コードファーストモードでコンテキストが使用されています。これは正しく動作しません。この問題を修正するには、この例外をスローするコード行を削除しないでください。データベースファーストまたはモデルファーストを使用する場合は、Entity Framework接続文字列が起動プロジェクトのapp.configまたはweb.configに含まれていることを確認してください。独自のDbConnectionを作成する場合は、それがEntityConnectionであり、他の種類のDbConnectionではなく、DbConnectionをとる基本DbContextコンストラクタの1つに渡すことを確認してください。コードファースト、データベースファースト、モデルの詳細については、まずEntity Frameworkのドキュメントを参照してください。http : //go.microsoft.com/fwlink/?LinkId=394715 '
stackoverflowには、データベースの最初のapporachを使用している間に、単体テストに重点を置いたたくさんの質問がありますが、誰も私のような類似の問題はないようです。
OnModelCreating()
コメントを解除します。 DbContext
をMoqでモックしてDbContext
。これは絶対にオプションではありません。 インメモリーデータベースを作成して使用するにはどうしたらいいですか?
追加情報
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: 'モデル生成中に1つ以上の検証エラーが検出されました: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);
}