3

Tech Days で Scott Gu によって紹介された EF 4.3 およびデータベース移行で MVC 4.0 を使用する方法を理解しようとしていましたが、多対多の関係が存在する場合に作成されるデータベースで問題が発生しました。

http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2364は 21:14 に開始します

以下の画像に示すように、データベースの生成に使用されたコードのスニペットが含まれています。

public class Trip    {
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime Begin { get; set; }
    public DateTime End { get; set; }
    public Location HomeCountry { get; set; }
    //public IList<Location> Itinerary { get; set; }

    public ICollection<Location> Itinerary { get; set; }

    public Trip()
    {
        this.Itinerary = new HashSet<Location>();
    }
}


public class Location
{
    public int ID { get; set; }
    public string Name { get; set; }

    public ICollection<Trip> Trips { get; set; }

    public Location()
    {
        this.Trips = new HashSet<Trip>();
    }

}

これが結果のデータベースでした。(私は画像を投稿したはずですが、まだ新しいユーザーであるため、画像を投稿できません)

テーブル
  場所
    PK ID (整数)
       名前 (varchar)
       Trip_ID (整数)
  旅行
    PK ID (整数)
       名前 (varchar)
       開始 (日時)
       終了 (日時)
       HomeCountry_ID (整数)

Locations テーブルに Trip_Id 列を追加するのではなく、Locations と Trips の間の多対多の関係 (多くの Locations を多くの Trips に適用できる) のために 3 番目の関係テーブルが作成されることを期待していたと思います。ここで私が何を間違えたか知っている人はいますか?これらのテーブルを正しく作成するためにデータベースの自動化を取得する方法はありますか?

ご協力いただきありがとうございます。

更新: 次のリンクを見つけましたが、EF 4.3 を使用してこれを機能させることができません。また、次の投稿を反映するようにコード スニペットを編集しました。

http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First

4

1 に答える 1

1

更新された質問に追加したリンクを使用して、最終的にテーブルを正しく作成することができましたが、まだソリューションで実際には販売されていません。私の Db Context クラスに、メソッド [protected override void OnModelCreating(DbModelBuilder modelBuilder)] を追加しました。

public class MyTesterContext : DbContext
{
    public MyTesterContext () : base("name=MyTesterContext ")
    {
    }

    public DbSet<Trip> Trips { get; set; }
    public DbSet<Location> Locations { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Trip>().
          HasMany(t => t.Itinerary).
          WithMany(l => l.Trips).
          Map(
           m =>
           {
               m.MapLeftKey("TripID");
               m.MapRightKey("LocationID");
               m.ToTable("TripLocations");
           });
    }

}

新しいデータベースは次のようになります。

テーブル
  場所
    PK ID (整数)
       名前 (varchar)
  旅行場所
       TripID (整数)
       LocationID (整数)
  旅行
    PK ID (整数)
       名前 (varchar)
       開始 (日時)
       終了 (日時)
       HomeCountry_ID (整数)

コードプロジェクトの議論では、次のように述べています:
http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First

したがって、既存の関係テーブルには小さな問題があります。OnModelCreating メソッドをオーバーライドし、Code First Fluent API を使用してマッピングを追加することで、問題を解決できます。

私は既存のリレーション テーブルを持っていなかったので、正直なところ、この手順が必要になるとは思いませんでしたが、これを取得して適切なテーブル構造を作成する他の方法を見つけることができませんでした。このテクノロジに慣れてきたら、OnModelCreating メソッドをオーバーライドする必要性を回避する方法を見つけられることを願っています。

于 2012-06-15T15:08:33.263 に答える