我正在学习使用流利的nhibernate,并且无法理解如何创建我的映射。我有一个具有多列主键的表,但我无法正确映射它。我有以下流畅的映射 -
public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity>
{
public void Override(AutoMapping<MyEntity> mapping)
{
mapping.CompositeId()
.KeyProperty(x => x.Id_1, "Id_1")
.KeyProperty(x => x.Id_2, "Id_2");
mapping.References(x => x.otherEntity)
.Column("JoinColumn");
// Commented out to attempt to map to another entity on multiple columns
//mapping.HasMany(x => x.thirdEntit)
// .KeyColumns.Add("thirdId_1", "thirdId_2")
// .Cascade.All();
}
}
我遇到的问题是复合ID似乎不起作用。
以下是生成的映射文件的片段 -
<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="identity" />
</id>
然后我得到一个错误,即在查询的任何表中找不到列(id)。
我认为我的映射代码会产生正确的复合ID我错了吗?我错过了什么或做错了什么吗?
答案 0 :(得分:3)
建议(并且我已经取得了很多成功),如果您正在使用CompositeKeys,则按照以下方式使用ID对象:
在你的情况下,你要创建一个新类......
[Serializable]
public MyEntityIdentifier
{
public virtual TYPE Id_1;
public virtual TYPE Id_2;
// You need to override Equals(MyEntityIdentifier), Equals(object obj) and GetHashCode()
}
然后您的映射变为
public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity>
{
public void Override(AutoMapping<MyEntity> mapping)
{
mapping.CompositeId()
.ComponentCompositeIdentifier(x => x.MyEntityIdentifier)
.KeyProperty(x => x.MyEntityIdentifier.Id_1, Id_1, "Id_1")
.KeyProperty(x => x.MyEntityIdentifier.Id_2, "Id_2");
// snip
}
}
您的课程从拥有两个属性(Id_1和Id_2)到拥有MyEntityIdentifier。
然后在需要加载时使用MyEntityIdentifier ..
MyEntity entity = Session.Load<MyEntity>(new MyEntityIdentifier { Id_1 = Whatever, Id_2 = Whatever });
如果您对此数据库有任何控制权,我强烈建议您不要使用CompositeKeys。虽然NHibernate肯定会处理它们,但它们会带来一些额外的心理复杂性和问题。