[英]Inserting / saving entity with nested children entities with Entity Framework
以下是課程:
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Child> Childs { get; set; }
public IEnumerable<ParentLog> Logs { get; set; }
}
public class ParentLog
{
public int Id { get; set; }
public DateTime On { get; set; }
public string Note { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public IEnumerable<ChildLog> Logs { get; set; }
}
public class ChildLog
{
public int Id { get; set; }
public DateTime On { get; set; }
public string Note { get; set; }
public int ChildId { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
}
在DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Parent>().HasMany(a => a.Childs);
modelBuilder.Entity<Parent>().HasMany(a => a.Logs);
modelBuilder.Entity<Child>().HasMany(a => a.Logs);
}
這個想法是當父母和孩子被保存時,父母和孩子的日志條目也被保存。 這行得通。
保存代碼:
DateTime now = DateTime.Now;
foreach (var a in parents)
{
a.Logs = new List<ParentLog>();
a.Logs.Add(new ParentLog
{
On = now,
Note = "Created",
Name = a.Name
});
foreach(var b in a.Childs)
{
b.Logs = new List<ChildLog>();
b.Logs.Add(new ChildLog
{
On = now,
Note = "Created",
Name = b.Name,
ParentId = b.ParentId //not needed with the Accepted Answer.
});
}
}
int recordsAffected = new ParentRepository().SaveParents(parents);
public int SaveParents(List<Parent> items)
{
foreach(var item in items)
{
_db.Parents.Add(item);
}
return _db.SaveChanges();
}
我遇到的問題是ChildLog.ParentId
。 它沒有預期值的值,我想它來自Child.ParentId
。
我的問題,如何解決?
將導航屬性添加到子 model,ChildLog >Child。
然后,您將能夠通過 Child 訪問 ParentId。
進一步閱讀 - https://docs.microsoft.com/en-us/ef/ef6/fundamentals/relationships
事實證明 EF 可以在一個 SaveChanges() 中處理它。 不過,我需要明確定義關系。
以下是已更新的類:
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public IEnumerable<ChildLog> Logs { get; set; }
//Added
public Parent Parent { get; set; }
}
public class ChildLog
{
public int Id { get; set; }
public DateTime On { get; set; }
public string Note { get; set; }
public int ChildId { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
//Added
public Child Child { get; set; }
}
這是 DbContext 中更新的 OnModelCreating 方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var parent = modelBuilder.Entity<Parent>();
parent.HasKey(a => a.Id);
parent.Property(a => a.ParentId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
parent.HasMany(a => a.Logs); //ParentLog
var child = modelBuilder.Entity<Child>();
child.HasKey(a => new { a.Id, a.ParentId });
child.Property(a => a.ChildId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
child.HasRequired(a => a.Parent).WithMany(a => a.Childs).HasForeignKey(a => a.ParentId);
var childLog = modelBuilder.Entity<ChildLog>();
childLog.HasKey(a => new { a.Id, a.ChildId, a.ParentId });
childLog.Property(a => a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
childLog.HasRequired(a => a.Child).WithMany(a => a.Logs).HasForeignKey(a => new { a.ChildId, a.ParentId });
}
這對我有幫助-> 如何解決:關系約束中的從屬角色和主要角色中的屬性數量必須相同?
對於那個小而重要的事情,麻煩太多了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.