NHibernate, «On Delete Cascade», каскадное удаление строк в связанных таблицах?

Я впервые использовал NHibernate (с сопоставлениями Fluent-NHibernate) в проекте за последние несколько недель, все шла хорошо до сегодняшнего дня, когда у меня возникла проблема (скорее всего, моя собственная ошибка).

Я сделал небольшой образец, чтобы проиллюстрировать то, чего я пытаюсь достичь:

public class Image
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Path { get; set; }
}

public class FeaturedImage
{
    public virtual int Id { get; set; }
    public virtual Image Image { get; set; }
    public virtual string Description { get; set; }
    public virtual DateTime Date { get; set; }
}

public class ImageMap : ClassMap<Image>
{
    public ImageMap()
    {
        Id(x => x.Id).GeneratedBy.Identity().UnsavedValue(0);
        Map(x => x.Name);
        Map(x => x.Path);
    }
}

public class FeaturedImageMap : ClassMap<FeaturedImage>
{
    public FeaturedImageMap()
    {
        Id(x => x.Id).GeneratedBy.Identity().UnsavedValue(0);
        Map(x => x.Description);
        Map(x => x.Date);
        References(x => x.Image).Not.Nullable().Cascade.Delete();
    }
}

В приведенном выше примере есть несколько изображений, каждый день одно изображение выбирается как «избранное», одно и то же изображение может быть фигурирует несколько раз. Я бы хотел, чтобы при удалении изображения все записи FeaturedImage, ссылающиеся на этот идентификатор изображения, автоматически удалялись. Однако в настоящий момент, если я пытаюсь удалить изображение, которое было показано, оно выдает ошибку:

Оператор DELETE вступает в конфликт с ограничением REFERENCE «FKF42D8269692640D». Таблица конфликтов «dbo.FeaturedImage», столбец «Image_id».

Если вручную добавить «ON DELETE CASCADE» к ограничению внешнего ключа идентификатора изображения, это сработает:

alter table [FeaturedImage]
 add constraint FKF42D8269692640D foreign key ( Image_id ) references [Image] ON DELETE CASCADE

... но я не уверен, что это рекомендуемый способ сделать это? Если бы кто-нибудь мог посоветовать лучший способ достижения этого, мы были бы очень признательны! Заранее спасибо.

7
задан Janine SL 25 July 2011 в 01:05
поделиться