Nhibernate:在相同的2个实体之间映射两个不同的属性

时间:2009-12-21 12:00:34

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个A类:

public class ClassA
{
      public int ID {get; private set;}
      public string Code {get; private set;}
      public ClassB B {get; private set;}
      public IList<ClassB> ListB {get; private set;}

}

和ClassB:

public class ClassB
{
      public int ID {get; private set;}
      public string Code {get; private set;}
      public ClassA A {get; private set;}
      //some other attributes...
}

和映射:

public ClassAMap()
{
    Table("ClassA");

    Id(classA => classA .ID, "ID").GeneratedBy.Identity();
    Map(classA  => classA.Code, "Code").Unique().Not.Nullable();
   //HERE IS THE PROBLEM: --------
    References(classA  => classA.B,"IDClassB").Cascade.SaveUpdate(); 
   //-----
    HasMany(classA  => classA.ListB).Table("ClassB").KeyColumn("IDClassA").AsBag().Not.LazyLoad().Inverse().Cascade.AllDeleteOrphan();
}

ClassB映射:

public ClassBMap()
{
    Table("ClassB");
    Id(classB => classB.ID).GeneratedBy.Identity();
    References(classB => classB.A, "IDClassA").ForeignKey("ID").Cascade.SaveUpdate();

}

classA中ListB的映射工作正常,因为起初只有ListB属性而不是B,当我不得不映射B时我试过这个:

References(classA  => classA.B,"IDClassB"); 

映射测试失败,因为B未保存,所以我这样做了:

References(classA  => classA.B,"IDClassB").Cascade.SaveUpdate(); 

这次B被保存了,但是通过保存B,classA被A.B和B.A插入了两次。

我该如何解决这个问题?为什么它适用于ListB属性而不适用于B属性?感谢

1 个答案:

答案 0 :(得分:0)

我通过在classA中创建一个包含B和listB元素的列表来解决这个问题,属性B和listB现在是对该新列表的“视图”。为了在这个新列表中区分以前的listB元素和以前的B属性,我在classB中添加了一个boolean,如果true为B则为false是listB元素。