我想知道通过更少的数据库调用是否可以实现以下目的。
我有一个模型,需要回去并将其他相同类型的实体保存到自身(显然避免循环引用)。
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的了解不足以知道在哪个阶段我将引用浅表副本而不是原始实体。