11

コードファーストのEntityFrameworkと.NET4を使用して、親と子の間に1対多の関係を作成しようとしています。

public class Parent
{
    [Key]
    public int ParentId { get; set; }
    [Required]
    public string ParentName { get; set; }
    public IEnumerable<Child> Children { get; set; }
}

public class Child
{
    [Key]
    public int ChildId { get;  set; }
    [ForeignKey]
    public int ParentId { get; set; }
    [Required]
    public string ChildName { get; set; }
}

ここで指摘したように、外部キーの関係をデータベースに取り込むには、IDだけでなく、実際のオブジェクトをリンクする必要があります。子がその親への参照を含む場合にこれを行う通常の方法()。

しかし、実装で外部キーを強制するにはどうすればよいですか?これは逆です(親が子を参照します)?

4

1 に答える 1

20

まず第一に:IEnumerable<T>コレクションナビゲーションプロパティには使用できません。EFはこのプロパティを無視します。ICollection<T>代わりに使用してください。

ParentIdこれを変更した場合、特定の例では、外部キーのプロパティ名が規則(プリンシパルエンティティの主キーの名前)に従っておりParent、EFが必要な1対多の関係を検出するため、何もする必要はありません。ParentそしてChild自動的に。

別の「型破りな」FKプロパティ名がある場合でも、Fluent APIを使用してそのようなマッピングを定義できます。たとえば、次のようになります。

public class Child
{
    [Key]
    public int ChildId { get;  set; }

    public int SomeOtherId { get; set; }

    [Required]
    public string ChildName { get; set; }
}

マッピング:

modelBuilder.Entity<Parent>()
    .HasMany(p => p.Children)
    .WithRequired()
    .HasForeignKey(c => c.SomeOtherId);

私の知る限り、この関係をデータ注釈で定義することはできません。属性を使用するには[ForeignKey]、外部キープロパティが含まれている依存エンティティのナビゲーションプロパティが必要です。

于 2012-07-05T20:18:40.283 に答える