我继承了一个数据库,并尝试将其映射到Fluent NHibernate。我有以下架构:
CREATE TABLE [Signatures](
[Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
-- Other Fields....
)
CREATE TABLE [SignoffSteps](
[Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
[SignatureId] [int] NULL REFERENCES [Signatures]([Id]),
-- Other Fields....
)我尝试将其映射到以下内容(省略了额外的属性和映射):
public class SignoffStep
{
public virtual int Id { get; set; }
public virtual Signature Signature { get; set;}
public class Map : ClassMap<SignoffStep>
{
public Map()
{
Table("SignoffSteps");
Id(x => x.Id);
References(x => x.Signature, "SignatureId")
.Nullable()
.ForeignKey("FK_SingoffSteps_Signatures")
.Cascade.All()
.Not.LazyLoad();
}
}
}
public class Signature
{
public virtual int Id { get; set; }
public class Map : ClassMap<Signature>
{
public Map()
{
Table("Signatures");
Id(x => x.Id);
}
}
}这很有效,除了一个恼人的地方:删除签名。如果我手动删除签名,我可以让它工作:
session.Delete(signoffStep.Signature);
signoffStep.Signature = null;但是我想要做的就是将signoff步骤中的Signature属性设置为null,并让NHibernate自动删除该子元素。有没有一种方法可以设置我的映射来做到这一点?
编辑:将级联设置为"all-delete-orphan“不可行:

发布于 2012-04-10 22:05:01
我最终在签名上有了一个"ToDelete“属性,并在保存时手动删除了它们。我不喜欢这个b/c,它打破了抽象,但现在可以用了。
我认为要想真正修复它,我必须重做一些表和关联。不幸的是,在这种情况下,这是不可能的。
发布于 2012-04-02 23:55:48
尝试将级联设置更改为"all-delete-orphan“。当前您正在级联除删除之外的所有内容,这意味着当您尝试创建“孤立”记录时,DB将发出警告。通过告诉NHibernate如何处理这个问题(在update或delete操作之后删除被引用表中的任何孤立记录),就可以避免这个问题。
请理解,为了让NH的级联工作,引用表的FK必须是可空的,以便NH可以在第一次传递中将其设置为null (孤立记录)。AFAIK,NH目前不提供使用不可为空的FK级联删除子记录的方法。
https://stackoverflow.com/questions/9944611
复制相似问题