使用 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;}
}
我正在尝试使用 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;}
}