HasOne还是参考?

时间:2012-03-30 14:10:22

标签: fluent-nhibernate fluent-nhibernate-mapping

我继承了一个数据库,我正在尝试将其映射到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”不可行: Intellisense

2 个答案:

答案 0 :(得分:1)

尝试将Cascade设置更改为“all-delete-orphan”。目前,您正在级联删除所有内容,这意味着当您尝试创建“孤立”记录时,数据库会抱怨。通过告诉NHibernate如何处理这个问题(在更新或删除操作后删除引用表中的任何孤立记录),可以避免这个问题。

了解为了使NH的级联工作,引用表的FK必须是可空的,以便NH可以在其第一次传递中将其设置为空(孤立记录)。 AFAIK,NH目前没有提供一种方法来级联删除具有不可为空的FK的子记录。

答案 1 :(得分:0)

我最终在签名上有一个“ToDelete”属性,并在我保存时手动删除它们。我不喜欢这个b / c它打破了抽象但它现在有效。

我认为要真正修复它我想要的,我将不得不重做表和关联。不幸的是,在这种情况下,这是不可能的。