Entity Framework Core:複合オブジェクトを追加する方法は?

c# entity-framework entity-framework-core

質問

次のような複合オブジェクトがあります。

public class Parent
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("ChildRefId")]
    public Guid ChildId { get; set; }

    public Child Child { get; set; }
}

public class Child
{
    [Key]
    public Guid Id { get; set; }

    [ForeignKey("ParentRefId")]
    public int ParentId { get; set; }

    public Parent Parent { get; set; }
}

ParentChildは1対1の関係を持っています:

modelBuilder.Entity<Parent>()
    .HasOne(parent => parent.Child)
    .WithOne(child => child.Parent)
    .WillCascadeOnDelete();

私はChildを持つ新しいParentを作成し、それをDBに保存しようとします:

var parent = new Parent { Child = new Child() };
dbContext.Parents.Add(parent);
dbContext.SaveChanges(); //<-- Exception!

...そして次の例外が発生します:

System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Parent_Child_ChildId". The conflict occurred in database "MyDatabase", table "dbo.Child", column 'Id'.

私がdbコンテキストを使って子を作成すると、うまく動作します:

var child = dbContext.Childs.Add(new Child());
var parent = new Parent { Child = child };
dbContext.Parents.Add(parent);
dbContext.SaveChanges(); //<-- It works fine

質問#1:ネストされたコレクションに新しいエンティティを簡単に追加することができます。しかし、それは1対1の関係では機能しません。例えば:

var parent = new Parent();
parent.Grandparents.Add(new Grandparent();
dbContext.Parents.Add(parent);
dbContext.SaveChanges(); //<-- It works fine and parent with one new grandparent were created!

どうして?

質問#2:私が間違っていることを教えてください。子供を作るためにコンテキストを持たない子供と新しい親をどうやって救うことができますか(ネストされたコレクションのようなもの)を教えてください。

ありがとうございました!

受け入れられた回答

このエラーは、EFのbeta-8版でのみ発生します。私がEFをrc1-final版に更新した後、エラーが消えた。 beta-8版ではまだグラフの追跡がないと説明されるかもしれません。

ここで詳しい情報を見つけることができます。


人気のある回答

流暢な構文宣言(modelBuilder.Entity ...)を削除する必要があります。このインスタンスでは必須ではありません。

また、コンテキストを使用してオブジェクトを作成する必要があります。また、Idキーの値を指定する必要があります。キーにはIntを使用し、キーを生成する自動データベース挿入注釈と組み合わせるのが一般的です。例えば

public class Child {
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

[ForeignKey("ParentRefId")]
public int ParentId { get; set; }

public Parent Parent { get; set; }
}

コンテキストを使ってモデルオブジェクトを作成する必要があります。

using(MyDbContext db = new MyDbContext()) {
  Child child = db.Childs.Create();
  Parent parent = db.Parents.Create();
  child.Parent = parent;
}
db.SaveChanges();
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ