2016-09-08 9 views
2

親クラスがデータベース生成識別子を使用していない場合、子オブジェクトに外部キーが自動的に設定されるようにEntity Frameworkを設定する方法を教えてください。子の外部キーを自動的に設定するようにEFを設定する方法

例モデル:

public class Parent 
{ 
    [Key] 
    public string Name { get; set; } 

    public virtual List<Child> Children { get; set; } 
} 

public class Child 
{ 
    [Key] 
    [Column(Order = 1)] 
    public string ParentName { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public string ChildName { get; set; } 
} 

例シード方法:

context.Parents.AddOrUpdate(p => p.Name, 
    new Parent 
    { 
     Name = "Test", 
     Children = new List<Child> 
     { 
      new Child {ParentName = "Test", ChildName = "TestChild"}, 
      new Child {ParentName = "Test", ChildName = "NewChild"} 
     } 
    }); 

は私が手動でそれぞれの新しい子供のためParentName =「テスト」を設定する必要がないようにEFを設定することは可能です子供のリストに?

編集 - ここで生成された移行

CreateTable(
    "dbo.Parents", 
    c => new 
    { 
     Name = c.String(nullable: false, maxLength: 128), 
    }) 
    .PrimaryKey(t => t.Name); 

CreateTable(
    "dbo.Children", 
    c => new 
    { 
     ParentName = c.String(nullable: false, maxLength: 128), 
     ChildName = c.String(nullable: false, maxLength: 128), 
    }) 
    .PrimaryKey(t => new {t.ParentName, t.ChildName}) 
    .ForeignKey("dbo.Parents", t => t.ParentName, cascadeDelete: true) 
    .Index(t => t.ParentName); 
+0

なぜFKとして関係を設定できませんか? – Sampath

+0

@Sampath慣例により、FKが構成されています。私はそれが設定されていることを示すために移行を追加しました。私は、親の子供リストにアイテムを追加するときに、FKのParentNameが自動的にEFによって設定されるかどうかを疑問に思っています。 – DeadlyGhost1

+0

Related、possible duplicate:[エンティティフレームワークの自動外部キー人口](http://stackoverflow.com/questions/33904871/entity-framework-automatic-foreign-key-population) – stuartd

答えて

1

あなたは、子クラスにナビゲーションプロパティを追加したモデルを設定し、すべてが

public class Child 
{ 
    [Key] 
    [Column(Order = 1)] 
    public string ParentName { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public string ChildName { get; set; } 

    public virtual Parent Parent { get; set; } // <-- Add this 
} 

を動作するはずです。これは、コンフィギュレーション

であることが可能です
 modelBuilder.Entity<Parent>() 
      .HasMany(_ => _.Children) 
      .WithRequired(_ => _.Parent) 
      .HasForeignKey(_ => _.ParentName); 

(wit hout Child.Parentそれは動作しません、全く変な動作)

+0

ありがとう@bubi私はちょうど仮想ナビゲーションプロパティ。その構成は必要ありませんでした。私の場合、ナビゲーションプロパティは必要ありませんでしたので、私はそれを持っていませんでした。 EFは、Child.Parentナビゲーションプロパティをオーバーライドして設定するときに、ParentNameプロパティを設定する必要があります。 – DeadlyGhost1

+0

私は常に設定を追加します。私はEFのアップデートについて怖いです:) – bubi

関連する問題