2012-04-20 8 views
2

私はthisを見ました。エンティティリレーションシップなどのEntity Framework 5(プレリリース)初心者の問題

私はEF 5で同様のことをしたいと思います。私はForeignKey属性が表示されず、代わりにEF5に関連付け属性が表示されます。誰かがこれが何をするかを説明することができます。また

は、/意味:

プライマリキーは、デフォルトの規則でマッピングされます

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Match>() 
       .HasRequired(m => m.HomeTeam) 
       .WithMany(t => t.HomeMatches) 
       .HasForeignKey(m => m.HomeTeamId) 
       .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Match>() 
       .HasRequired(m => m.GuestTeam) 
       .WithMany(t => t.AwayMatches) 
       .HasForeignKey(m => m.GuestTeamId) 
       .WillCascadeOnDelete(false); 
} 

これは説明です。チームには2つの マッチのコレクションが必要です。 2つのFKによって参照される単一のコレクションを持つことはできません。 Matchは、これらの自己参照多対多で が動作しないため、カスケード削除なしでマップされます。私が何をしたいか

は、リンクの例と非常によく似ていますが、私にはわからない:

  1. 私は
  2. 主キーがそれぞれにリンクしますDbContext
  3. を変更する必要がある場合私は明示的に協会を使用する必要がある場合は
  4. 他の関係

を作成するために、任意の説明が理解されます。

答えて

1

さて、私はまだチェックアウトしていないので、EFベータ版のForeignKey属性の質問に答えることができません。しかし

... LINQの美しさだ

modelBuilder.Entity<Match>() - Take the entity "Match" and perform following operations on it 
.HasRequired(m => m.HomeTeam) - The entity needs to have a non-null navigation HomeTeam... 
.WithMany(t => t.HomeMatches) - ... which has a subset of Matches by navigation HomeMatches 
.HasForeignKey(m => m.HomeTeamId) ... and the associating foreign key is HomeTeamId on Match 
.WillCascadeOnDelete(false); ... and don't cascade when the entity is deleted. 

は、それがない自己文書よりも頻繁です。あなたは、モデルの関係を変更したり、エンティティを削除/追加しているとき

さて、...あなたの3つの質問のためのよう

  1. のみDbContextを変更します。追加する場合は、 公開DbSetエンティティ{get;セット; 削除する場合は削除してください。

  2. 主キーは相互にリンクしていません。外部キーは主キーにリンクします。慣例では、Projectという名前のナビゲーションオブジェクト、Projectというナビゲーションオブジェクト、Idと呼ばれるプロパティを持つProjectという別のエンティティがある場合、自動的にProjectIdを最初のエンティティからIdのプロジェクトエンティティにマップし、プロジェクトエンティティをナビゲーション項目として指定します。 DBからEF経由でデータを取得するときの最初のエンティティ:

  3. 非コンベンションベースの関係が必要な場合のみ。つまり、主キーは「Id」や「ProjectId」ではなく、「tblId」や「ParentId」の行に沿っています。または、選択したエンティティのみの削除をカスケードするなど、一部の項目で異なる種類の動作が必要です。EF 5では

1

あなたはマイグレーションを使用している場合、あなたはカスケード削除を実装しないように移行コードを変更することができます。

CreateTable(
      "dbo.Match", 
      c => new 
       { 
        MatchId = c.Long(nullable: false, identity: true), 
        Description = c.String(), 
        HomeTeamId = c.Long(nullable: false), 
       }) 
      .PrimaryKey(t => t.MatchId) 
      .ForeignKey("dbo.Team", t => t.HomeTeamId, cascadeDelete: false)     
      .Index(t => t.MatchId) 
      .Index(t => t.HomeTeamId); 

    } 

またはそのような何か。