2011-07-25 76 views
6

我在过去几周内第一次在一个项目中使用NHibernate(与Fluent-NHibernate映射),直到今天我遇到了问题(很可能是我自己的错误),一切都很顺利。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条目都会自动被删除。然而,此刻,如果我尝试删除它已收录它抛出一个错误的图片:

The DELETE statement conflicted with the REFERENCE constraint "FKF42D8269692640D". Conflict table "dbo.FeaturedImage", column 'Image_id'.

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

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

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

回答

5

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

你想要做的事情可以通过在Image中创建一个FeaturedImage集合来完成,将它映射为一个在包含key级联中删除的反包。

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

+0

谢谢!我从FeaturedImageMap中删除了'.Cascade.Delete()'并向ImageMap添加了'HasMany(x => x.Featured).Inverse()。ForeignKeyCascadeOnDelete()。KeyColumn(“Image_id”);似乎现在正在完美工作。 –