Fluent Mapping: с использованием таблицы соединений и каскадов - PullRequest
0 голосов
/ 15 ноября 2010

возникли небольшие проблемы с отображением для следующей настройки таблицы:

               Shop
             [1]  [1]                 
            /       \
          [n]       [n]
   Category-[m]---[n]-Article

Поведение должно быть следующим:
1 - при удалении магазина должны быть удалены все статьи и категории
2 - при удалении категории связанные статьи должны быть неназначенными, но не удаляться
3 - при удалении статьи связанные категории должны быть неназначенными, но не удаляться

Вот текущее отображение:

public class ShopMap: ClassMap<Shop>
{
    public ShopMap()
    {
        this.Table("shop");
        Id(x => x.Id).Column("id").GeneratedBy.Native();
        Map(x => x.Name).Column("name");

        HasMany(x => x.Categories).Cascade.AllDeleteOrphan;
        HasMany(x => x.Articles).Cascade.AllDeleteOrphan;
    }
}

public class CategoryMap: ClassMap<Category>
{
    public CategoryMap()
    {
        this.Table("category");
        Id(x => x.Id).Column("id").GeneratedBy.Native();
        Map(x => x.Name).Column("name");

        References(x => x.Shop);

        HasManyToMany(x => x.Articles).Cascade.AllDeleteOrphan()
                                    .Table("article_category")
                                    .ChildKeyColumn("article_id")
                                    .ParentKeyColumn("category_id")
                                        .Inverse();
    }
}

public class ArticleMap: ClassMap<Article>
{
    public ArticleMap()
    {
        this.Table("article");
        Id(x => x.Id).Column("id").GeneratedBy.Native();
        Map(x => x.Name).Column("name");

        References(x => x.Shop);

        HasManyToMany(x => x.Categories).Cascade.All()
                                    .Table("article_category")
                                    .ParentKeyColumn("article_id")
                                    .ChildKeyColumn("category_id");
    }
}

При удалении категории (Session.Delete ()) NH также пытается удалить связанные статьи.Изменение каскадного режима на SaveUpdate исправит это, но оставит записи в таблице ссылок * article_category *.Подводя итог: Cascade.SaveUpdate слишком ленив, Cascade.All слишком нетерпелив.

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

Любые идеи о том, как (свободно) отобразить это, будут высоко оценены!

Заранее спасибо

Себи

1 Ответ

1 голос
/ 15 ноября 2010

Записи остаются в таблице ссылок, потому что Category.Articles определяется как обратная сторона отношения. Вам нужно удалить Category из Article.Categories перед удалением, чтобы удалить запись ссылки.

...