Я хотел бы знать, возможно ли следующее с меньшим количеством вызовов базы данных.
У меня есть модель, в которой мне нужно вернуться и сохранить в себе другие объекты того же типа (очевидно, избегая циклических ссылок).
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, чтобы знать, на каком этапе я буду ссылаться на мелкую копию вместо исходная сущность.