簡體   English   中英

使用實體框架插入/保存具有嵌套子實體的實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM