Я строю иерархию групп для представления организационной структуры. У меня есть одна группа верхнего уровня, которая затем имеет ряд подгрупп. Каждая подгруппа может иметь любое количество подгрупп и так далее.
Я создал базу данных sql с двумя таблицами.
Группы со следующими столбцами.
- Идентификатор (целое число)
- Описание (nvarchar(max))
GroupChildren со следующими столбцами.
- Идентификатор (целое число)
- Идентификатор группы (целое число)
- ChildGroupId (целое число)
Например, если в группе 1 есть две подгруппы, группа 2 и группа 3, в таблице групп будет 3 записи.
- Идентификатор - 1, Описание - Группа 1
- Идентификатор - 2, Описание - Группа 2
- Идентификатор - 3, Описание - Группа 3
В таблице GroupChildren будет 2 записи.
- Id - идентификатор первичного ключа, GroupId - 1, ChildGroupId - 2
- Id - идентификатор первичного ключа, GroupId - 1, ChildGroupId - 3
Это связывает две мои дочерние группы с группой 1. У меня есть два класса POCO для представления этого, которые следующие:
public class Group
{
public int Id { get; set; }
public string Description { get; set; }
public virtual ICollection<GroupChild> GroupChildren { get; set; }
}
public class GroupChild
{
public int Id { get; set; }
public int GroupId { get; set; }
public Group ChildGroup { get; set; }
}
Я создал картографы для обоих этих классов, которые настроены следующим образом.
internal class GroupMapper : EntityTypeConfiguration<Group>
{
internal GroupMapper()
{
HasKey(t => t.Id);
Property(t => t.Id).HasColumnName("Id").IsRequired();
Property(t => t.Description).HasColumnName("Description").IsRequired();
ToTable("Groups");
}
}
internal class GroupChildMapper : EntityTypeConfiguration<GroupChild>
{
internal GroupChildMapper()
{
HasKey(g => g.Id);
Property(g => g.Id).HasColumnName("Id").IsRequired();
Property(g => g.GroupId).HasColumnName("GroupId").IsRequired();
HasRequired(g => g.ChildGroup)
.WithMany()
.Map(x => x.MapKey("ChildGroupId"))
.WillCascadeOnDelete(false);
ToTable("GroupChildren");
}
}
Чтобы получить группу и подгруппы, которые я вызываю
return GetDbSet<Group>()
.Where(c => c.Id == id)
.Single();
Это возвращает группу с идентификатором и описанием, но я получаю следующую ошибку при просмотре свойства GroupChildren
Недопустимое имя столбца "Group_Id".
Недопустимое имя столбца "Group_Id".
Столбец «Group_Id» не существует ни в коде, ни в базе данных. Я пытался решить эту проблему, просматривая другие сообщения, и некоторые предполагают, что это способ, которым EF интерпретирует значения первичного/внешнего ключа, но я не могу найти, как я могу это решить?
Спасибо
ChildGroup
есть столбецGroup_Id
. Однако, когда я добавляюGroup
и добавляю к нему несколько объектовGroupChild
, я получаю, что HierachyDb.GroupChildren' участвует в отношении "GroupChild_ChildGroup". 0 связанных 'GroupChild_ChildGroup_Target' были найдены. 1 Ожидается «GroupChild_ChildGroup_Target». Но прежде чем пытаться это исправить, позвольте мне спросить: почему не простая иерархия с однимGroup
классом сGroups
коллекцией? Ваша модель с прерывистыми классами довольно неуклюжа для иерархии. И ребенок может быть родителем своего собственного родителя! - person Gert Arnold   schedule 23.11.2012