S # arp Архитектура переопределений сопоставления «многие ко многим» не работает - PullRequest
2 голосов
/ 29 ноября 2009

Я попробовал почти все, чтобы заставить отображения 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.

1 Ответ

1 голос
/ 03 декабря 2009

Удалось решить проблему, которая оказалась ошибкой S # arp для новичков.

Для сохранения данных ManyToMany метод контроллера должен иметь присвоенный ему атрибут [Транзакция].

...