我继承了一个数据库,我正在尝试将其映射到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;
但我想做的只是将签名步骤中的Signature属性设置为null,并让NHibernate自动删除子进程。有没有办法设置我的映射来执行此操作?
编辑:将Cascade设置为“all-delete-orphan”不可行:
答案 0 :(得分:1)
尝试将Cascade设置更改为“all-delete-orphan”。目前,您正在级联删除所有内容,这意味着当您尝试创建“孤立”记录时,数据库会抱怨。通过告诉NHibernate如何处理这个问题(在更新或删除操作后删除引用表中的任何孤立记录),可以避免这个问题。
了解为了使NH的级联工作,引用表的FK必须是可空的,以便NH可以在其第一次传递中将其设置为空(孤立记录)。 AFAIK,NH目前没有提供一种方法来级联删除具有不可为空的FK的子记录。
答案 1 :(得分:0)
我最终在签名上有一个“ToDelete”属性,并在我保存时手动删除它们。我不喜欢这个b / c它打破了抽象但它现在有效。
我认为要真正修复它我想要的,我将不得不重做表和关联。不幸的是,在这种情况下,这是不可能的。