Entity Framework: Обновить сущность, связав ее с коллекцией объектов одного типа. - PullRequest
0 голосов
/ 02 сентября 2018

Я хотел бы знать, возможно ли следующее с меньшим количеством вызовов базы данных.

У меня есть модель, в которой мне нужно вернуться и сохранить в себе другие объекты того же типа (очевидно, избегая циклических ссылок).

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();
        }

Очевидно, что это не очень хорошо масштабируется, когда пользователи импортируют на карту файлы с сотнями строк с десятками связанных свойств.

Я немного поигрался с «GroupBy» на CoolProp и вычистил самоссылающийся ListingID, но я не достаточно уверен в своих знаниях EF, чтобы знать, на каком этапе я буду ссылаться на мелкую копию вместо исходная сущность.

1 Ответ

0 голосов
/ 02 сентября 2018

Вы пытались просто добавить все сущности и вызвать .SaveChanges ()? EF попытается Топологическая сортировка на объектах, чтобы они были вставлены в порядке, который соответствует зависимостям внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...