2009-12-21 53 views
0

我有一个A类:Nhibernate:在相同的2个实体之间映射两个不同的属性

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(); 

} 

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

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

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

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

此时B已保存,但通过保存B,classA被插入两次,由AB和BA

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

+0

行,我需要有另一个属性,在CLASSB布尔值,指示如果从一个CLASSA B或一个数组listB元件被引用。 在CLASSB: 公共BOOL ISB {获得;私人集;} 现在我不得不NHibernate的说,当我得到B中CLASSA我必须去CLASSB表并IDClassA和SB =真 – 2009-12-21 12:50:05

+0

Myabe得到它我就会把B,为数组listB元素太多,但与IsB布尔值设置为true,解决了这个问题... – 2009-12-21 13:30:11

回答

0

我解决了这个创建于CLASSA B和数组listB列表,包含B和数组listB元素,属性现在“意见”在新的列表。为了从前面的B属性中区分出前面的listB元素,我在classB中添加了一个布尔值,如果为true,那么B为false就是listB元素。

相关问题