Я попробовал почти все, чтобы заставить отображения M: M работать в S # arp Architecture. К сожалению, пример проекта Northwind не имеет переопределения M: M.
Все работало нормально в моем проекте, прежде чем перейти на S # arp и выбрать Auto Mapping для Fluent NHibernate. Мне нравится автоматическое отображение, это хорошо, но переопределения, похоже, не регистрируются.
Кажется, что все работает в памяти и в тестах, однако при фиксации данных в базу данных в мою справочную таблицу M: M ничего не вставляется.
Если мы возьмем простой образец категории, в которой может быть много продуктов, а продукт может быть во многих категориях, у нас будет таблица CategoryProduct (мне не нравится множественное число), в которой есть столбцы Category_id и Product_id.
Моя модель персистентности Auto генерируется следующим образом:
return AutoPersistenceModel
.MapEntitiesFromAssemblyOf<Category>()
.Where(GetAutoMappingFilter)
.ConventionDiscovery.Setup(GetConventions())
.WithSetup(GetSetup())
.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
Переопределение отображения для категории выглядит так:
public class CategoryMap : IAutoMappingOverride<Category>
{
public void Override(AutoMap<Category> mapping)
{
mapping.Id(x => x.Id, "Id")
.WithUnsavedValue(0)
.GeneratedBy.Identity();
mapping.Map(x => x.Name).WithLengthOf(50);
mapping.Map(x => x.Depth);
mapping.HasMany<Category>(x => x.Children)
.Cascade.All()
.KeyColumnNames.Add("Parent_id")
.AsBag()
.LazyLoad();
mapping.HasManyToMany<Posting>(x => x.Products)
.WithTableName("CategoryProduct")
.WithParentKeyColumn("Category_id")
.WithChildKeyColumn("Product_id")
.Cascade.All()
.AsBag();
}
}
И Продукт имеет переопределение отображения как таковое:
public class ProductMap : IAutoMappingOverride<Product>
{
public void Override(AutoMap<Product> mapping)
{
mapping.Id(x => x.Id, "Id")
.WithUnsavedValue(0)
.GeneratedBy.Identity();
mapping.Map(x => x.Title).WithLengthOf(100);
mapping.Map(x => x.Price);
mapping.Map(x => x.Description).CustomSqlTypeIs("Text");
mapping.References(x => x.Category).Cascade.All();
mapping.HasMany<ProductImage>(x => x.Images).Inverse().Cascade.All().LazyLoad();
mapping.HasManyToMany<Category>(x => x.Categories)
.WithTableName("CategoryProduct")
.WithParentKeyColumn("Product_id")
.WithChildKeyColumn("Category_id")
.Inverse()
.AsBag();
}
}
Я пробовал много комбинаций структурирования отображений M: M, но ничего не работает.
В этой статье есть предложение перекомпилировать S # arp с обновлением FHN, я пробовал это сделать, однако последний код FHN сильно отличается от того, который использовался в S # arp. Исправлены все конфликтующие конфликты, но они все еще не работают.
Надеюсь, кто-то еще столкнулся и решил проблемы переопределения автоматического сопоставления M: M с помощью S # arp.