我在尝试与没有主键的表支持的实体之间建立HasMany
关系时遇到了最大的麻烦。
ClassA
有一个CompositeId
。为了避免在primary key
上缺少ClassB
,我尝试在CompositeId
上创建一个ClassB
,其中包含表格中的所有列。无论我尝试过什么,都没有任何效果。
这些是我的类和映射。
public class ClassA
{
public virtual int a_1_id {get;set;}
public virtual string a_2_id {get;set;}
public virtual IList<classB> ClassBs { get; set; }
public override int GetHashCode()
{
int hashCode = 0;
hashCode = hashCode ^ a_1_id ^ a_2_id.GetHashCode();
return hashCode;
}
public override bool Equals(object obj)
{
var toCompare = obj as ClassB;
return (toCompare != null) && (this.GetHashCode() != toCompare.GetHashCode());
}
}
public class ClassAMap : ClassMap<ClassA>
{
public ClassAMap()
{
Schema("dbo");
Table("ClassA");
Not.LazyLoad();
CompositeId()
.KeyProperty(x => x.a_1_id, "a_1_id")
.KeyProperty(x => x.a_2_id, "a_2_id");
HasMany(x => x.ClassBs)
.Table("ClassB")
.KeyColumn("a_2_id")
.Not.LazyLoad();
}
}
public class ClassB
{
public virtual string a_2_id {get;set;}
public virtual string b_field1 {get;set;}
public override int GetHashCode()
{
int hashCode = 0;
hashCode = hashCode
^ a_2_id.GetHashCode()
^ b_field1.GetHashCode();
return hashCode;
}
public override bool Equals(object obj)
{
var toCompare = obj as ClassB;
return (toCompare != null) && (this.GetHashCode() != toCompare.GetHashCode());
}
}
public class ClassBMap : ClassMap<ClassB>
{
public ClassBMap()
{
Schema("dbo");
Table("ClassB");
Not.LazyLoad();
CompositeId()
.KeyProperty(x => x.a_2_id, "a_2_id")
.KeyProperty(x => x.b_field1, "b_field1");
}
}
答案 0 :(得分:0)
如果它依赖于ClassA,则不需要将classB映射为实体。
public class ClassA
{
public virtual int Id1 {get;set;}
public virtual string Id2 {get;set;}
public virtual IList<string> Bs { get; private set; }
public override int GetHashCode()
{
return (Id1 << 16) ^ Id2.GetHashCode();
}
public override bool Equals(object obj)
{
var toCompare = obj as ClassA;
return (toCompare != null) && (this.Id1 == toCompare.Id1) && (this.Id2 == toCompare.Id2);
}
}
public class ClassAMap : ClassMap<ClassA>
{
public ClassAMap()
{
Schema("dbo");
Table("ClassA");
Not.LazyLoad();
CompositeId()
.KeyProperty(x => x.Id1, "a_1_id")
.KeyProperty(x => x.Id2, "a_2_id");
HasMany(x => x.ClassBs)
.AsSet()
.Table("ClassB")
.KeyColumn("a_2_id")
.Not.LazyLoad(),
.Element("b_field1"); // if there is only 1 value column or
.Component(c => // if there is more than 1 value column
{
c.ParentReference(x => x.A);
c.Map(x => x.Value1, "b_field1");
c.Map(x => x.Value2, "b_field2");
c.Map(x => x.Value3, "b_field3");
});
}
}
public class ClassB
{
public virtual ClassA A {get;set;}
public virtual string Value1 {get;set;}
public virtual string Value2 {get;set;}
public virtual string Value3 {get;set;}
}
注意:ClassA的gethashcode实现是完全错误的,Euqals不应该依赖hashcode,因为它会发生冲突