使用 EF 核心将多个关系数据添加到 SQL 服务器

Add multiple relational data into SQL server using EF core

我正在尝试使用 EF 核心 5 将多个关系数据插入 SQL 服务器数据库。 我想插入多个 parents 和多个 child。 Parents 和 child 是一对多的关系。我正在尝试使用添加它 context.AddRang(lstparents) 它仅为一个 parents 插入 child 实体数据,而对于 parents 的其余部分则没有条目。你能帮我解决这个问题吗?

我的模型

    Public class Parent
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      Public int64 Id {get; set;}// this is identity column
    
      Public string Name { get; set;}
    
      Public List<Child> child { get; set;}
    }

    Public class Child
    {
       [Key]
       [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
       Public int64 id { get; set;} // identity column
       Public string ChildName { get; set;}
    
       Public int64 ParentId { get; set;}
    
       [Foreign key("ParentId")]
       Public Parent parent { get; set;}
    }


// Here is insertion logic

Public void main(string[] args)
{

List<Child> lstChild = new List<Child> () 
                      { 
                        new Child{ ChildName= "Child1Name"}, 
                        new Child{ ChildName= "Child2Name"}, 
                        new Child{ ChildName= "Child3Name"} 
                      }; 
List<Parent> lstparents = new List<Parent>()
                       { 
                        new Parent {Name = "xyz", Child= lstChild }, 
                        new Parent {Name = "xyz1", Child= lstChild} 
                       };
Context.AddRangeAsync(lstparents); 
Context.SaveChangesAsync();


}

我也尝试了以下选项,但我 运行 遇到了另一个问题。

选项 1:

Public void main(string[] args)
    {
    
    List<Child> lstChild = new List<Child> () 
                          { 
                            new Child{ ChildName= "Child1Name"}, 
                            new Child{ ChildName= "Child2Name"}, 
                            new Child{ ChildName= "Child3Name"} 
                          }; 
    List<Parent> lstparents = new List<Parent>()
                           { 
                            new Parent {Name = "xyz", Child= lstChild }, 
                            new Parent {Name = "xyz1", Child= lstChild} 
                           };
    foreach(var item in lstparents)
    {
        Context.Add(item); 
        foreach(var child in lstChild)
        {
            Context.Add(child); 
         }
     }
     Context.SaveChangesAsync();   
    }

选项 2: 在下面的代码行中,我收到一个错误 “当 IDENTITY_INSERT 设置为 OFF 时,无法在 table 中为标识列插入显式值”

Public void main(string[] args) {

    List<Child> lstChild = new List<Child> () 
                          { 
                            new Child{ ChildName= "Child1Name"}, 
                            new Child{ ChildName= "Child2Name"}, 
                            new Child{ ChildName= "Child3Name"} 
                          }; 
    List<Parent> lstparents = new List<Parent>()
                           { 
                            new Parent {Name = "xyz", Child= lstChild }, 
                            new Parent {Name = "xyz1", Child= lstChild} 
                           };
    foreach(var item in lstparents)
    {
        Context.Entry(item).State=EntityState.Added; 
        foreach(var child in lstChild)
        {
            Context.Entry(child).State=EntityState.Added; 
         }
     }
     Context.SaveChangesAsync();   
    }

因为你有 one-to-many 关系(一个 parent 可以有很多 children)你不能添加一个 child 设置为很多 parent秒。如果你需要它,你需要配置 many-to-many 关系。所以如果你想添加 2 parents 你将不得不创建 2 个 children 列表,而不是一个

List<Child> childList1 = new List<Child> () 
                      { 
                        new Child{ ChildName= "Child1Name"}, 
                        new Child{ ChildName= "Child2Name"}, 
                        new Child{ ChildName= "Child3Name"} 
                      }; 
List<Child> childList2 = new List<Child> () 
                      { 
                        new Child{ ChildName= "Child4Name"}, 
                        new Child{ ChildName= "Child5Name"}, 
                        new Child{ ChildName= "Child6Name"} 
                      }; 
List<Parent> lstparents = new List<Parent>()
                       { 
                        new Parent {Name = "parent1", Child= childList1 }, 
                        new Parent {Name = "parent2", Child= childList2 } 
                       };

并且由于您的 main 不是异步的,您只能使用同步操作

Context.AddRange(lstparents); 
Context.SaveChanges();

恕我直言,让 ParentId 可以为空可能是个好主意

 public long? ParentId { get; set;}

如果您需要添加多对多,则需要添加一个 ParentChild table。

如果你使用net5+,ef core可以帮你添加,你只需要更改导航属性

 Public class Parent
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public long Id {get; set;}// this is identity column
    
      public string Name { get; set;}
    
      public virtual ICollection<Child> Childs { get; set;}
    }

    Public class Child
    {
       [Key]
       [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
       public long Id { get; set;} // identity column
       public string ChildName { get; set;}
          
       public virtual ICollecton<Parent> Parents { get; set;}
    }