Я создал самореферентную сущность с использованием EF Core, которая выглядит следующим образом:
Сущность
public class DetailType
{
public int DetailTypeId { get; set; }
public string Name { get; set; }
public int? ParentTypeId { get; set; }
public DetailType ParentType { get; set; }
public IEnumerable<DetailType> ChildTypes { get; set; }
}
Привязка
modelBuilder.Entity<DetailType>()
.ToTable("detailtype")
.HasOne(x => x.ParentType)
.WithMany(x => x.ChildTypes)
.HasForeignKey(x => x.ParentTypeId);
Я получаю эти объекты через API, и текущий результат выглядит примерно так:
[
{
"detailTypeId": 20,
"name": "Money",
"parentTypeId": null,
"parentType": null,
"childTypes": null
},
{
"detailTypeId": 22,
"name": "Optional Extra",
"parentTypeId": null,
"parentType": null,
"childTypes": [
{
"detailTypeId": 42,
"name": "Extra Nights",
"parentTypeId": 22,
"childTypes": null
}
]
},
{
"detailTypeId": 42,
"name": "Extra Nights",
"parentTypeId": 22,
"parentType": {
"detailTypeId": 22,
"name": "Optional Extra",
"parentTypeId": null,
"parentType": null,
"childTypes": []
},
"childTypes": null
}
]
Проблема, с которой я столкнулся, заключается в том, что третий элемент в массиве - это как раз обратная сторона второго. Есть ли способ избежать этого, чтобы у меня были только отношения родитель -> ребенок, а не оба родитель -> ребенок, а также ребенок -> родитель. Приведенный выше пример представляет собой сильно урезанную версию того, что на самом деле возвращает мой API, поэтому я хочу максимально уменьшить ненужное раздувание, потому что будет много отношений.
В идеале я хочу просто избавиться от свойства ParentType, но по-прежнему иметь коллекцию ChildTypes, но я не уверен, как определить это в построителе моделей.
РЕДАКТИРОВАТЬ:
Я удалил беглые отношения, так как они не нужны. Я также пробовал следующее:
var roots = this.Items.Where(x => x.ParentTypeId == null);
foreach (var root in roots)
{
root.ChildTypes = this.Items.Where(x => x.ParentTypeId == root.DetailTypeId);
}
return roots.ToList();
(this.Items
- это, кстати, DbSet)
Однако для этого нужно изменить ChildTypes
на IQueryable
, и когда я это сделаю, я получаю следующее исключение:
Тип свойства навигации «ChildTypes» для типа сущности «DetailType» - «EntityQueryable», который не реализует ICollection. Свойства навигации коллекции должны реализовывать ICollection ‹> целевого типа.
.Where(x => x.parentTypeId == null)
, чтобы избавиться от всех элементов, кроме элементов верхнего уровня. Это должно обеспечить желаемый результат. - person Yeldar Kurmangaliyev   schedule 25.09.2018ChildTypes
, поэтому все, что я получаю, - это корневые элементы, которые мне не нужны. - person Andy Furniss   schedule 25.09.2018ChildItems
, не так ли? Зачем ему удалять все элементы вChildTypes
? - person Yeldar Kurmangaliyev   schedule 26.09.2018