[英]Fluent nHibernate map HasMany to Entity/Table with no Primary Key
我在嘗試建立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");
}
}
如果ClassB依賴於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不應依賴哈希碼,因為它將發生沖突
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.