我在数据库中有两个表:表A(父)有一个主键列,表B(子)根本没有键,但是对表A中的键的引用(亲本)。
列aID(不是主键/外键)引用表A(父)中的id。
image http://i62.tinypic.com/r8b7rp.jpg
我尝试在表B中使用复合键,但没有取得任何成功:
映射:
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);
}
实体A属性:
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<B> B { get; set; }
实体B属性:
public virtual A A { get; set; }
public virtual string Name { get; set; }
public virtual string Year { get; set; }
我也尝试过组件:
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();
}
但后来我得到以下例外:
内部异常:NHibernate.MappingException:集合映射中的重复列:TestProject.Test.A.B列:A_id
当我从数据库获取所有内容时,B列表不会被填充,是否有人在此代码中看到错误或者使用比使用复合键更好的解决方案?是否可以让nhibernate仅在应用程序层中使用标识符? 我无法更改数据库中的数据模型。
编辑:添加了新的异常,更改为自动属性。
答案 0 :(得分:1)
您应该使用组件,但是您应该使用一组组件。 请参阅:component collection mapping NHibernate 3.2
答案 1 :(得分:0)
您应该从实体B中删除AID属性,然后使用:
public BMap()
{
Map(b=> b.Name);
Map(b=> b.Year);
References(b => b.A).Column("aID");
}
有关详细信息,请参阅here。
答案 2 :(得分:0)
最后解决了它:
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);
}