實體框架核心:如何添加複合對象?

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有一對一的關係:

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:我可以輕鬆地將新實體添加到嵌套集合中,而無需使用上下文來創建它。但它不適用於一對一的關係。例如:

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合法嗎? 是的,了解原因