nhibernate - ограничение сохранности иерархии объектов - PullRequest
2 голосов
/ 18 июля 2011

В моем приложении у меня есть отношение "многие ко многим" (сопоставленное с FluentNHibernate) между Post и Tag:

Post
{
 string Title
 List<Tag> Tags 
}

Tag
{
 string Name
 List<Post> Posts
}

Отображения:

public class PostMap : ClassMap<Post>
    {
        public PostMap()
        {
            Table("Post");
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Title);
            HasManyToMany(x => x.Tags)
                .Table("PostTags")
                .ChildKeyColumn("Tag")
                .ParentKeyColumn("Post")
                .Cascade.SaveUpdate();
        }
    }

    public class PostTagMap : ClassMap<PostTag>
    {
        public PostTagMap()
        {
            Table("Tag");
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name);
            HasManyToMany(x => x.Posts)
                .Table("PostTags")
                .ChildKeyColumn("Post")
                .ParentKeyColumn("Tag")
                .Cascade.None();
        }
    }

Сохранение происходит через SaveOrUpdate в этом хранилище:

public class NHRepository : NHRepositoryBase, INHRepository
    {
        public NHRepository(IFactory factory)
            : base(factory)
        {
            this.session = this.sessionFactory.OpenSession();
        }

        public virtual TObject SaveOrUpdate<TObject>(TObject obj) where TObject : Domain.UniqueItem
        {
            var persistedObject = this.session.SaveOrUpdateCopy(obj);
            this.Commit();
            return persistedObject as TObject;
        }
}

У меня проблема при попытке сохранить элемент «Пост» с некоторыми тегами, где эти теги также относятся к некоторым другим вопросам. Сохранение сообщения приводит к тому, что теги теряют связь с другими вопросами. Я думаю, причина в том; в этом сценарии у меня нет сообщений, включенных в элементы Tag на данный момент, хотя в базе данных есть отношения.

Итак, я хочу ограничить уровень стойкости. Когда я сохраняю элемент Post, он должен только создавать отношения, а не удалять другие отношения между Post и Tag.

Где (в картографировании или хранилище) и как мне добиться этого ограничения?

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Inverse () должен быть добавлен в PostTagMapping, чтобы установить владельца отношения Post. PostTagMapping должен быть таким:

public PostTagMap()
{
    Table("Tag");
    Id(x => x.Id).GeneratedBy.GuidComb();
    Map(x => x.Name);
    HasManyToMany(x => x.Posts)
        .Table("PostTags")
        .ChildKeyColumn("Post")
        .ParentKeyColumn("Tag")
        .Cascade.None().Inverse();
}

(спасибо Ричарду за идею)

0 голосов
/ 18 июля 2011

В вашей опубликованной конфигурации ни классы отображения Post, ни Tag не сообщают Fluent NHibernate, какой класс отвечает за сохранение отношений, но вы каскадно сохраняете / обновляете из Post to Tag. Из-за этого FNH говорит PostMap обрабатывать сохранение тегов.

Вы должны указать PostMap разрешить PostTagMap обрабатывать свои собственные операции сохранения, добавив директиву Inverse().

public class PostMap : ClassMap<Post>
{
    public PostMap()
    {
        Table("Post");
        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.Title);
        HasManyToMany(x => x.Tags).Table("PostTags")
            .Cascade.SaveUpdate().Inverse();
    }
}

public class PostTagMap : ClassMap<Tag>
{
    public PostTagMap()
    {
        Table("Tag");
        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.Name);
        HasManyToMany(x => x.Posts).Table("PostTags")
            .Cascade.None();
    }
}

См. Эту суть для рабочего примера: https://gist.github.com/1090085

...