0

私はEntity Frameworkで作業しており、それにヒットするコードをテストしようとしています。すべてのコードは正常に動作しますが、テストに問題があります。テスト時にこのコードを実行すると:

_entities = new Mock<MyEntities>();
Database.SetInitializer(new DropCreateDatabaseAlways<MyEntities>());
_entities.Object.Database.Initialize(true);

「EntityType にキーが定義されていません」というエラーが表示されます。一部のテーブルは、id 列に「ID」または「[テーブル名]ID」という命名規則に従っていないため、以前にこれらを取得していました。それらをクリーンアップした後も、複合キーを持つテーブルのそれらを取得します。SQLに関する限り、それらは正しく定義されています。EDMX デザイナーで列をクリックすると、それらがキーであると表示されます。では、それらをキーとして適切に定義するにはどうすればよいでしょうか。コードはどこに置くのですか?

私はこれを調べてみましたが、すべての参照は具体的に Code First の実装に関するものです。とにかくやってみた。彼らは、DbContext オブジェクトの OnModelCreating メソッドをオーバーライドし、これを追加するように言いました。

modelBuilder.Entity<Widgets>().HasKey(widget => new { widget.A, widget.B });

そこで、部分クラスを作成してオーバーライドしようとしました。すでにオーバーライドされていました。それで、生成された部分クラスに行きました。実装は次のとおりです。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

それは正しくありません。それで、私は今何をしますか?

適切な統合テストを作成できるように、Web プロジェクトで EDMX に基づいてテスト データベースを生成したいと考えています。前もって感謝します。

4

1 に答える 1

2

EDMX を使用している場合は、データベースの初期化 (または onmodelcreating) を使用できません。これらの機能は、Code First に固有のものです。

EDMX からテスト データベースを生成することはできないため、ここでは答えがありません。

その場でテスト データベースを作成するために従うことができるいくつかのパターンがあります。2009 年に書いたブログ投稿からの貼り付け (http://thedatafarm.com/blog/data-access/unit-testing-in-ef-v1-the-database-conundrum/)

  • データベースのコピー/貼り付け: 小さな SQL Server Express データベースをテスト データベースとして使用します。特定のテストの過程で、db ファイルを特定の場所にコピーして貼り付け、接続を開きます。テストの最後に、ファイルを吹き飛ばします。

  • トランザクション: 各データベース アクセス テストで、コードを System.Transaction.TransactionScope 内にラップします。テストの最後に、トランザクションを完了しないでください。データベースはロールバックします。

  • DB スクリプト: 別のクライアントは、各テストの開始時にオンザフライで生成し、最後にデータベースを削除する小さなデータベースを使用していました。

そのため、キーを定義する場所は (Twitter で提案したように) モデル内です。デザイナーで、キーに属する各エンティティ プロパティを右クリックし、コンテキスト メニューで [エンティティ キー] がクリックされていることを確認します。EF は、これらのプロパティの組み合わせを複合エンティティ キーとして使用します。

それが役に立てば幸い。

于 2013-01-15T21:43:40.920 に答える