我正在尝试使用编码映射设置NHibernate(3.2.0.4000),但我无法使ComponentAsId正常工作。
我有一个数据库架构,我无法更改主键由字符串和日期组成的位置,因此我需要使用组件作为Id:
即
Id varchar(20) NOT NULL,
EffectiveDate datetime NOT NULL,
Property1 int
public class EffectiveDateId
{
public string Id { get; set; }
public DateTimeOffset EffectiveDate { get; set; }
}
public class MyClass
{
public EffectiveDateId Identity { get; set; }
public int Property1 { get; set; }
}
var mapper = new ConventionModelMapper();
mapper.Class<MyClass>(map => map.ComponentAsId(id => id.Identity, cid =>
{
cid.Property(x => x.Id, x => x.Length(20));
cid.Property(x => x.EffectiveDate);
}));
但这不起作用,因为MyClass上的身份属性为空。
XML映射如下所示:
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:nhibernate-mapping-2.2">
<class name="Test.MyClass, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<composite-id class="EffectiveDateId, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key-property name="Id" type="AnsiString" length="20" />
<key-property name="EffectiveDate" />
</composite-id>
<property name="Property1" />
</class>
</hibernate-mapping>
但是,如果我手动更改XML以包含 name =“Identity”,请执行以下操作:
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:nhibernate-mapping-2.2">
<class name="Test.MyClass, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<composite-id name="Identity" class="EffectiveDateId, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key-property name="Id" type="AnsiString" length="20" />
<key-property name="EffectiveDate" />
</composite-id>
<property name="Property1" />
</class>
</hibernate-mapping>
它有效。
我尝试通过添加(除了ComponentAsId映射)来设置id
mapper.Class<MyClass>(map => map.Id(id => id.Identity));
但这只会生成一个NHibernate.MappingException
Test.MyClass id的模糊映射。定义了带有生成器的id属性,并且您尝试将属性“Identity”的组件Test.EffectiveDateId映射为Test.MyClass的id。
使用调试器我可以看到,对于代码映射配置,ClassMapping.IdentifierProperty为null,而在XML配置中,它设置为NHibernate.Mapping.Property实例。
那么,ComponentAsId()的实现中是否存在未设置IdentifierProperty的错误,或者我做错了吗?
的问候, 埃蒙