NHibernate,“在删除级联”,级联删除相关表中的行?

时间:2011-07-25 01:05:13

标签: nhibernate fluent-nhibernate cascade cascading-deletes

我在过去的几周里第一次在一个项目中使用了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();
    }
}

在上面的示例中,有多个图像,每天一个图像被选为“特色”图像,同一图像可以多次显示。我想要的行为是当我删除图像时,引用该图像ID的任何FeaturedImage条目会自动被删除。但是,目前如果我尝试删除已经显示的图像,则会抛出错误:

  

DELETE语句与REFERENCE约束“FKF42D8269692640D”冲突。冲突表“dbo.FeaturedImage”,列'Image_id'。

如果如果手动将“ON DELETE CASCADE”添加到图像ID外键约束,它可以工作:

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

...但我不确定这是否是推荐的做法?如果有人可以建议实现这一目标的最佳方式,将不胜感激!提前谢谢。

1 个答案:

答案 0 :(得分:5)

您添加的.Cascade.Delete()位于关系的错误一侧,实际上会在您删除FeaturedImage时删除该图像。

您可以通过在Image中创建一系列FeaturedImage来完成您想要做的事情,将其映射为一个反向包,并在键中删除级联。

我不使用Fluent,但是在XML中,您在集合on-delete="cascade"元素中设置了<key>;寻找类似的东西。