Я пытаюсь выучить NH (версия 3.2) и у меня проблемы с пониманием некоторых вариантов картографирования. Скотт Финдлэйтер опубликовал свой полностью рабочий скелет для сексуального Loquacious NH здесь , и мои вопросы о картографировании будут основаны на его выборке.
Вот модель предметной области (рис. Не является частью его примера, но включена здесь для ясности):
![enter image description here](https://i.stack.imgur.com/fDUqC.jpg)
Его класс категории выглядит так:
public class Category : Entity
{
public Category()
{
Products = new List<Product>();
SubCategories = new List<Category>();
}
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual Category Parent { get; set; }
public virtual IEnumerable<Category> SubCategories { get; set; }
public virtual IList<Product> Products { get; set; }
}
и его класс отображения такой:
class CategoryMap : ClassMapping<Category>
{
public CategoryMap()
{
// **************************************************
// Mapping of Id here will take precedence over the
// global conventions configured in the ModelMapper.
// **************************************************
//Id(x => x.Id, map =>
//{
// map.Column("Id");
// map.Generator(Generators.GuidComb);
//});
Property(x => x.Name, m => m.Length(450));
Property(x => x.Description, m => m.Length(2000));
Set(x => x.SubCategories, set =>
{
set.Key(k => k.Column("ParentCategoryId"));
set.Inverse(true);
} ,
ce => ce.OneToMany());
ManyToOne(x => x.Parent, manyToOne =>
{
manyToOne.Column("ParentCategoryId");
manyToOne.Lazy(LazyRelation.NoLazy);
manyToOne.NotNullable(false);
});
Set(x => x.Products, set =>
{
set.Key(key =>
{
key.Column("ProductId");
key.ForeignKey("FK_Product_Category_ProductId");
});
set.Table("Product_Category");
},
ce => ce.ManyToMany(m => m.Column("CategoryId")));
}
}
Теперь по вопросам:
1) Почему он решил отобразить / смоделировать свойство Parent как отношение ManyToOne? Разве это не говорит о том, что Category может принадлежать более чем одной родительской категории, то есть любая данная категория (кроме корня, я полагаю) может быть распределена среди многих других родительских категорий? Если это так, то это не очень ясно из самой модели, потому что для меня Parent (как я вижу это в определении класса) выглядит как свойство типа Category, и я бы отобразил его так. Когда бы вы выбрали подход в этом решении v.s. отображать это как простое свойство?
2) Когда я сопоставляю файлы, с какой (или какой) перспективы я должен смотреть? Мне кажется, что это изнутри класса, который вы пытаетесь отобразить. Итак, в этом случае, когда я пытаюсь отобразить класс Category, меня интересует только отображение «стрелок», не так ли?
3) Лицо, создающее файлы сопоставления, должно обладать знаниями вне того, что ясно, просто посмотрев на класс. Посмотрите, как отображается свойство Products (отношение ManyToMany). Из самого класса ясно, что Категория может принадлежать многим Продуктам, но Категория не знает, что она может содержаться во многих Продуктах. Этот факт очевиден для класса Product. Теперь, когда я сказал, мне кажется, что при создании файла (-ов) сопоставления я должен смотреть с точки зрения класса И затем на модель.
4) Вообще говоря: когда вы используете .Inverse (), .Cascade () и .Lazy ()?
5) Каковы различия между отображением с использованием ModelMapper и ConventionModelMapper? Я не изучал файлы, включенные в тот же проект, которые используют последний метод, но я хотел бы знать, есть ли преимущество, кроме предпочтения, в использовании одного над другим.