我在数据库中有两个表:表A(父)有一个主键列,表B(子)根本没有键,但是对表A(父)中的键的引用。 / p>
列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属性:
private int _id;
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
private string _name;
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
private IList<B> _b;
public virtual IList<B> B
{
get { return _b; }
set { _b= value; }
}
实体B属性:
private int _aid;
public virtual int AID
{
get { return _aid; }
set { _aid = value; }
}
private A _a;
public virtual A A
{
get { return _a; }
set { _a= value; }
}
private string _name;
public virtual string Name
{
get { return _name; }
set { _name= value; }
}
private string _year;
public virtual string Year
{
get { return _year; }
set { _year= value; }
}
我也尝试了组件:
public BMap()
{
Id();
Component(b => b.A, bb =>
{
bb.Map(a => a.Id).Column("aID");
});
}
但后来我得到以下例外:
列名'A_id'无效。\ r \ n无效列名'A_id'。\ r \ n无效列名'id'。\ r \ n无效列名'id'。
无法初始化集合:[TestProject.Test.AB#7] [SQL:SELECT b0_.A_id as A5_1_,b0_.id as id1_,b0_.id as id90_0_,b0_.Name as Name90_0_,b0_ .Year as Year3_90_0_,b0_.aID为aID90_0_ FROM [Test.B] b0_ WHERE b0_.A_id =?]
当我从数据库获取所有内容时,B列表不会被填充,是否有人在此代码中看到错误或者使用比使用复合键更好的解决方案?是否可以让nhibernate仅在应用程序层中使用标识符? 我无法更改数据库中的数据模型。
编辑:添加例外并使用Component进行映射。
答案 0 :(得分:1)
考虑使用“组件”。 在nhibernate中有三种“类型”:实体,组件和基元。实体应具有标识符和ID列期间。因为例如,即使它们的数据相同,您也会认为两个实体是不同的。他们指出了不同的情况。 如果项目没有实体语义,它的行为类似于值类型,那么您应该使用组件。组件不需要自己的ID列,它们表现为值类型。