У меня много проблем с каскадным удалением через отношение 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 таким образом, чтобы удаление каскадно уменьшалось.
Заранее спасибо, я застрял на этом навсегда, поэтому я ценю любую помощь!