2012-03-30 45 views
1

我已经继承了一个数据库,我试图将它映射到流利NHibernate。 我有以下模式:HasOne或参考?

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; 

但我愿意做的仅仅是设置在签收步签名属性设置为null,并有NHibernate的自动删除的孩子。有没有办法设置我的映射来做到这一点?

编辑:设置级联到“全删除,孤儿”不可行: Intellisense

回答

0

我最终在Signature上有了一个“ToDelete”属性,并在保存时手动删除它们。我不喜欢这个B/C它打破抽象,但它现在工作。

我认为要真正解决它我想,我将不得不重做表和协会一点。不幸的是,在这种情况下,这是不可能的。

1

尝试改变级联设置“全删除,孤儿”。目前,除了删除之外,您还可以级联所有内容,这意味着当您尝试创建“孤立”记录时,数据库将会投诉。通过告诉NHibernate如何处理这个问题(在更新或删除操作后删除引用表中的孤立记录),可以避免这个问题。

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

+0

添加上面的编辑。 Cascade all-delete-orphan对于引用关系是不可能的,我认为这只在HasMany上。 – 2012-04-10 04:15:25

+0

upvotes努力。谢谢! – 2012-04-10 14:09:54