I've got two tables in database: Table A (parent) has a primary key column and Table B (child) doesn't have a key at all, but references to the key in table A (parent).
The column aID (not a primary/foreign key) refererences to the id in table A (parent).
I've tried to use a composite key in table B, but without any success:
Mappings:
public AMap()
{
Id(a=> a.Id);
Map(a=> a.Name);
HasMany(a=> a.B)
.Cascade.All();
}
public BMap()
{
CompositeId()
.KeyReference(b=> b.A, "aID");
Map(b=> b.Name);
Map(b=> b.Year);
}
Entity A properties:
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<B> B { get; set; }
Entity B properties:
public virtual A A { get; set; }
public virtual string Name { get; set; }
public virtual string Year { get; set; }
I've also tried components:
public AMap()
{
HasMany<B>(a => a.B)
.Component(b =>
{
b.References<A>(bb=> bb.A).Fetch.Join();
//b.Map(bb => bb.A).Column("aID");
b.Map(bb => bb.Name);
b.Map(bb => bb.Year);
})
.Inverse()
.Cascade.All();
}
But then i get following exceptions:
Inner exception: NHibernate.MappingException: Repeated column in mapping for collection: TestProject.Test.A.B column: A_id
The B list does not get populated when im getting all a:s from database, does anyone see something wrong in this code or have a better solution than using a Composite key ? Is it possible to let nhibernate use an identifier only in application layer ? I'm not able to change data model in database.
EDIT: Added new exception occured, changed to auto properties.
Finally solved it with:
public AMap()
{
....
....
HasMany(a=> a.B).KeyColumn("aID").Inverse().Cascade.All();
}
public BMap()
{
CompositeId()
.KeyProperty(b=> b.AID)
.KeyProperty(b=> b.Name)
.KeyProperty(b=> b.Year);
References(b=> b.A).Column("aID");
Map(b=> b.Name);
Map(b=> b.Year);
}