c# - 实体框架:更新与相同类型对象集合相关的实体
问题描述
我想知道以下是否可以通过更少的数据库调用来实现。
我有一个模型,我需要返回并将其他相同类型的实体保存到自身(显然避免循环引用)。
public class OneItemOfTheModel
{
[Key]
[Display(Name = "PK Id")]
public int OneItemOfTheModelPK{ get; set; }
[Display(Name = "Listing ID")]
public int ListingID{ get; set; }
[Display(Name = "Cool Property name")]
public string CoolProp{ get; set; }
[Display(Name = "Related Models")]
public virtual ICollection<OneItemOfTheModel> RelatedModels { get; set; }
[Display(Name = "Parent Object Thing")]
public virtual ParentObjectThing ParentObj { get; set; }
}
数据是从 csv 文件的行中导入的。最初将创建一个“父对象事物”,创建一个新模型实体并将其链接到该父对象,并使用 csv 中的行填充字段:
ListingID/CoolProp
1, "whoa"
2, "awesome"
3, "data"
4, "awesome"
5, "awesome"
期望的结果是在数据库中链接具有相同“酷属性”的实体时得到以下结果:
PK/ListingID/CoolProp/RelatedModels/ParentObj
5083,1,"whoa",,53
5084,2,"awesome",[5086,5087],53
5085,3,"data",,53
5086,4,"awesome",[5084,5087],53
5087,5,"awesome",[5084,5086],53
目前,我首先将实体保存到数据库中,然后运行另一种后续方法将各个实体链接在一起。
public void SyncRelatedProperties (int parentObjID, efContext db )
{
List<OneItemOfTheModel> myItemList = db.OneItemOfTheModel.Where(b => b.ParentObjID == ParentObjID && b.CoolProp.Length > 0).ToList();
if (myItemList.Count() > 0)
{
foreach( OneItemOfTheModel t in myItemList)
{
List<OneItemOfTheModel> tmplist = db.OneItemOfTheModel.Where(b => b.CoolProp == t.CoolProp && b.ListingID != t.ListingID).ToList();
foreach ( OneItemOfTheModel b in tmplist)
{
t.RelatedModels.Add(b);
}
}
db.SaveChanges();
}
显然,当用户导入具有数百行和数十个相关属性的文件时,这不能很好地扩展。
我在 CoolProp 上玩了一些“GroupBy”并清除了自引用的 ListingID 但我对我的 EF 知识没有足够的信心知道在哪个阶段我将引用浅拷贝而不是原始实体.
解决方案
您是否尝试过添加所有实体并调用 .SaveChanges()?EF 将尝试对实体进行拓扑排序,以便它们以与外键依赖项一致的顺序插入。
推荐阅读
- kubernetes - 学习kubernetes的范围是什么?
- reactjs - 如何在 React 中使用 Typescript 分配变量之前声明一个变量,而没有“类型中缺少索引签名”错误
- docker - hyperledger fabric byfn.sh up 失败,脚本 scripts.sh 未找到
- php - 数组中的逗号分隔值
- android - 房间数据库类初始化
- ios - 无法在 UIViewController 中向 UIImageView 添加渐变
- java - Jersey Viewable 显示 json 而不是 JSP
- powershell - 如果 Powershell 中的 foreach 循环内的条件不匹配
- css - 在 WebForms 中显示 SVG 图像
- c# - 如何在unity3D中用另一个替换完整的项目地形?