Каскад с замком ActiveRecord HasAndBelongsToMany's - PullRequest
0 голосов
/ 04 мая 2009

У меня много проблем с каскадным удалением через отношение HasAndBelongsToMany с использованием Castle ActiveRecord / NHibernate.

У меня есть фотографии, которые принадлежат многим тегам. К ним присоединяется таблица PhotoHasTag, которая имеет только photoId и tagId. Когда я удаляю фотографию, я хотел бы, чтобы все связанные записи PhotoHasTag были удалены, а также любые затем потерянные теги были также удалены.

Прямо сейчас у меня есть настройки моего класса Фото примерно так:

    [ActiveRecord(Table="Photo")]
    public class Photo
    {
        [PrimaryKey(Column = "photoId", Generator = Castle.ActiveRecord.PrimaryKeyType.Identity)]
        public virtual int Id { get; set; }    

        [HasAndBelongsToMany(Table="PhotoHasTag",ColumnKey="photoId",ColumnRef="tagId",Lazy=true,Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)]
        public virtual IList<Tag> Tags { get; set; }
    }

И мой класс Tag настроен примерно так же:

    [ActiveRecord(Table="Tag")]
    public class Photo
    {
        [PrimaryKey(Column = "tagId", Generator = Castle.ActiveRecord.PrimaryKeyType.Identity)]
        public virtual int Id { get; set; }  

        [HasAndBelongsToMany(Table = "PhotoHasTag", ColumnKey = "tagId", ColumnRef = "photoId", Lazy = true)]
        public IList<Photo> Photos { get; set; }
    }

Когда я пытаюсь удалить фотографии, я получаю сообщение об ошибке от SQL Server:

The DELETE statement conflicted with the REFERENCE constraint "PhotoHasTag_FK1". 

Я могу обойти это в SQL Server, установив правило удаления для ключа в Cascade, но тогда удаляется только PhotoHasTag. Если есть какие-либо потерянные теги, они все еще будут храниться в базе данных.

Я подумываю написать Триггер, чтобы позаботиться о оставшихся тегах, но я был бы намного счастливее, если бы был способ настроить сопоставления ActiveRecord таким образом, чтобы удаление каскадно уменьшалось.

Заранее спасибо, я застрял на этом навсегда, поэтому я ценю любую помощь!

1 Ответ

2 голосов
/ 13 мая 2009

Вы можете указать каскадное поведение в атрибутах следующим образом:

[HasAndBelongsToMany(Table = "PhotoHasTag", Cascade=ManyRelationCascadeEnum.AllDeleteOrphan, ColumnKey = "tagId", ColumnRef = "photoId", Lazy = true)]
public IList<Photo> Photos { get; set; }

Документация API , вероятно, более полезна.

...