Free nHibernate HasMany card in Entity / Table without a primary key

I have the most difficult problem setting HasMany relationship to an object supported by a table without a primary key.

ClassA has a CompositeId . To get around the lack of a primary key on ClassB , I tried creating a CompositeId on ClassB , which consisted of all the columns in the table. No matter what I tried, nothing worked.

These are my classes and mappings.

 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
c # nhibernate fluent-nhibernate fluent-nhibernate-mapping
source share
1 answer

you do not need to map classB as an entity if it depends on ClassA.

 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 => xA); 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;} } 

Note: the implementation of the ClassA GAT code is not simple correctly, and Euqals should not rely on hashcode because it will have conflicts

0
source share

All Articles