实体框架:更新实体,使其与相同类型的对象的集合相关

时间:2018-09-02 16:27:59

标签: c# asp.net-mvc entity-framework

我想知道通过更少的数据库调用是否可以实现以下目的。

我有一个模型,需要回去并将其他相同类型的实体保存到自身(显然避免循环引用)。

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的了解不足以知道在哪个阶段我将引用浅表副本而不是原始实体。

1 个答案:

答案 0 :(得分:0)

您是否尝试过仅添加所有实体并调用.SaveChanges()? EF会在实体上尝试Topological Sort,以便按照与外键依赖项一致的顺序插入实体。