首页 > 解决方案 > 实体框架:更新与相同类型对象集合相关的实体

问题描述

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

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

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 知识没有足够的信心知道在哪个阶段我将引用浅拷贝而不是原始实体.

标签: c#asp.net-mvcentity-framework

解决方案


您是否尝试过添加所有实体并调用 .SaveChanges()?EF 将尝试对实体进行拓扑排序,以便它们以与外键依赖项一致的顺序插入。


推荐阅读