我有一个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属性?感谢
答案 0 :(得分:0)
我通过在classA中创建一个包含B和listB元素的列表来解决这个问题,属性B和listB现在是对该新列表的“视图”。为了在这个新列表中区分以前的listB元素和以前的B属性,我在classB中添加了一个boolean,如果true为B则为false是listB元素。