powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Fluent NHibernate mapping, Parent-Child, ориентированный граф
8 сообщений из 8, страница 1 из 1
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37264712
smu127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть Оборудование
Код: plaintext
1.
2.
3.
4.
public class Equipment : EntityBase<Equipment>
{
	public virtual string Name { get; set; }
	...
}
Оборудование связано между собой.
Есть главное оборудование(Parent), а есть зависимое(Child).
Parent может иметь несколько Child. Child может зависеть от нескольких Parent.
Эти связи необходимо хранить.
Мне важно, чтобы оборудование знало своих родителей и своих детей.
Это всё похоже на ориентированнай граф.
Я хочу это сделать вот так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public class Equipment : EntityBase<Equipment>
{
	public virtual string Name { get; set; }
	public virtual IList<Equipment> Child { get; private set; }
	public virtual IList<Equipment> Parent { get; private set; }
	...
	<Методы для добавления и удаления в Child и Parent>
}
В базе данных это должно храниться в 2 таблицах:
Equipment: Id, Name, ... ; и допустим
Communication: Parent_id, Child_id;
Попробовал использовать HasManyToMany.
Таблицы правильно создаёт, а вот с сохранением и извлечением данных не получается.
Если писать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
public EquipmentMapping()
{
	Id(e => e.Id);
	Map(e => e.Name).Not.Nullable();
	HasManyToMany(e => e.Child).Table("Communication").ParentKeyColumn("Child_id").ChildKeyColumn("Parent_id");
	HasManyToMany(e => e.Parent).Table("Communication").ParentKeyColumn("Parent_id").ChildKeyColumn("Child_id");
}
то в базу записывается в 2 раза больше элементов, чем есть на самом деле. Ну и следовательно загружаются данные не правильно.
Если же сделать вот так:
Код: plaintext
1.
2.
3.
4.
5.
public EquipmentMapping()
{
	Id(e => e.Id);
	Map(e => e.Name).Not.Nullable();
	HasManyToMany(e => e.Child).Table("Communication").ParentKeyColumn("Child_id").ChildKeyColumn("Parent_id");
}
то данные в базу добавляются правильно, но при извлечении список Parent всегда пуст.
Вчём ошибка? Как должен выглядить мапинг?
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37264882
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smu127,

Мне кажется, вы запутали себя логически. Рассматривайте Equipment как корневой элемент, владеющий двумя коллекциями Equipment. И мапить так:

public EquipmentMapping()
{
Id(e => e.Id);
Map(e => e.Name).Not.Nullable();
HasManyToMany(e => e.Children).Table("Communication").ParentKeyColumn("Parent_id").ChildKeyColumn("Child_id");
HasManyToMany(e => e.Parents).Table("Communication").ParentKeyColumn("Parent_id").ChildKeyColumn("Child_id");
}

PS. Называть коллекции объектов единственным числом не комильфо.
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37265675
smu127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,
Попробовал сделать, как вы писали. В итоге в Communication также добавляется в 2 раза больше элементов. Только теперь нет повторяющихся записей. Вместо них появились зеркально отображенные.
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37266480
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smu127,

Я так понимаю, вы хотите чтобы обе связи в коллекции падали в одну строчку в с таблице Communication?
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37266915
smu127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

Да. Примерно так.
Попробовал сделать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class Communication : EntityBase<Communication>
{
	public virtual Equipment Parent { get; set; }
	public virtual Equipment Child { get; set; }
}
public class Equipment : EntityBase<Equipment>
{
	public virtual string Name { get; set; }
	public virtual IList<Communication> Children { get; private set; }
	public virtual IList<Communication> Parents { get; private set; }
	...
	public virtual void AddParent(Equipment parent){...}
	public virtual void AddChild(Equipment child){...}
}
public CommunicationMapping()
{
	Id(c => c.Id);
	References(c => c.Parent).Column("Parent_id").Nullable().Fetch.Join();
	References(c => c.Child).Column("Child_id").Nullable().Fetch.Join();
}
public EquipmentMapping()
{
	Id(e => e.Id);
	Map(e => e.Name).Not.Nullable();
	HasMany(e => e.Parents).KeyColumn("Parent_id");
	HasMany(e => e.Children).KeyColumn("Child_id");
}
При вызове AddChild создается объект класса Communication, заносится в коллекцию Parents вызвавшего объекта и в коллекцию Children переданного.
В таблице Communication на связь Parent-Child будет только одна запись.
Можно ли получить такой же эффект используя HasManyToMany и не создавая класса Communication?
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37267489
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smu127,

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

PS. Communication - это конечно связь, но подразумевает под собой передачу информации. Для связи между объектов лучше использовать название Relation.
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37267508
smu127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

Спасибо за советы, и помощь в решении проблемы.
...
Рейтинг: 0 / 0
Fluent NHibernate mapping, Parent-Child, ориентированный граф
    #37284200
smu127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказалось, что последний вариант маппинга работает не правильно. Дело в том, что в моём тесте я не всё проверял. Записывалось в базу правильно, но при загрузке Parent и Child менялись местами.
Код: plaintext
1.
2.
3.
4.
5.
6.
public EquipmentMapping()
{
    Id(e => e.Id);
    Map(e => e.Name).Not.Nullable();
    HasMany(e => e.Parents).KeyColumn("Child_id").Inverse();
    HasMany(e => e.Children).KeyColumn("Parent_id").Inverse();
}
Изменив вот таким образом маппинг, все встало на место. Я поменял "Parent_id" и "Child_id" местами и добавил Inverse().
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Fluent NHibernate mapping, Parent-Child, ориентированный граф
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]