2

私はこのSOの質問を見ました。

EF 5で同様のことをしたいのですが、ForeignKey属性は表示されませんが、EF5ではAssociation属性が表示されます。

また、誰かがこれが何を意味するのか/意味するのか説明できますか?

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によって参照される単一のコレクションを持つことはできません。一致は、多対多のこれらの自己参照では機能しないため、カスケード削除なしでマップされます。

私がやりたいことはリンクの例と非常に似ていますが、わかりません:

  1. DbContextを変更する必要がある場合
  2. 主キーが相互にリンクするタイミング
  3. 関係を作成するために明示的にAssociationを使用する必要がある場合

説明をいただければ幸いです。

4

2 に答える 2

1

EF 5 では、移行を使用している場合、カスケード削除を実装しないように移行コードを変更できます。

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);

    }

またはそのようなもの。

于 2012-07-25T06:11:40.487 に答える
1

わかりました... EFベータ版のForeignKey属性の質問にはまだ答えられません。まだチェックする機会がなかったからです。

でも...

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.

それが LINQ の優れた点です。ほとんどの場合、自己文書化されます。

さて、あなたの3つの質問について...

  1. モデルの関係を変更したり、エンティティを追加/削除したりする場合にのみ、DbContext を変更します。追加する場合は、public DbSet Entities { get; を実行する必要があります。設定; また、削除する場合などは削除してください。

  2. 主キーは互いにリンクしません。外部キーは主キーにリンクします。慣例により、ProjectId、Project と呼ばれるナビゲーション オブジェクト、および Id と呼ばれるプロパティを持つ Project と呼ばれる別のエンティティがある場合、最初のエンティティから ProjectId が Project エンティティの Id に自動的にマップされ、Project エンティティがナビゲーション アイテムとして渡されます。 EF 経由で DB からデータをフェッチするときの最初のエンティティ:

  3. 慣習に基づかない関係が必要な場合のみ。つまり、主キーは、たとえば、「Id」や「ProjectId」ではなく、「tblId」または「ParentId」の行に沿っています。または、選択したエンティティのみの削除時にカスケードするなど、一部のアイテムで別の種類の動作が必要です。

于 2012-06-09T19:58:19.553 に答える