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();
}
}
在上面的示例中,有多个图像,每天都会选择一张图像作为“特色”图像,同一张图像可以多次出现。我想要的行为是,当我删除图像时,引用该图像 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
...但我不确定这是否是推荐的方法?如果有人可以建议实现这一目标的最佳方法,我们将不胜感激!提前致谢。
I've been using NHibernate (with Fluent-NHibernate mappings) in a project for the first time over the last few weeks, all was going well until today when I've hit a problem (most probably my own error).
I've made a small sample to illustrate what I'm trying to achieve:
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();
}
}
In the example above there are multiple images, each day one image gets picked as a "featured" image, the same image can be featured multiple times. The behaviour I would like is when I delete an image any FeaturedImage entries referencing that image ID automatically get deleted. However, at the moment if I try to delete an Image which has been featured it throws an error:
The DELETE statement conflicted with the REFERENCE constraint "FKF42D8269692640D". Conflict table "dbo.FeaturedImage", column 'Image_id'.
If If manually add "ON DELETE CASCADE" to the image id foreign key constraint it works:
alter table [FeaturedImage]
add constraint FKF42D8269692640D foreign key ( Image_id ) references [Image] ON DELETE CASCADE
...but I'm not sure if this is the recommended way of doing this? If anyone could advise the best way of achieving this it would be greatly appreciated! Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您添加的
.Cascade.Delete()
位于关系的错误一侧,当您删除FeaturedImage 时,它实际上会导致该Image 被删除。你想要做的可以通过在 Image 中创建一个FeaturedImage的集合来完成,将其映射为一个逆袋,并在键中进行级联删除。
我不使用 Fluent,但在 XML 中,您可以在集合
元素中设置on-delete="cascade"
;寻找类似的东西。The
.Cascade.Delete()
you added is in the wrong side of the relationship, and it would actually cause the Image to be deleted when you delete a FeaturedImage.What you want to do can be accomplished by creating a collection of FeaturedImage in Image, map it as an inverse bag with cascade-deleting in the key.
I don't use Fluent, but in XML you set
on-delete="cascade"
in the collection<key>
element; look for something similar.