我有一个这样的映射文件:
<class name="Resource" table="resource" discriminator-value="null">
<composite-id name="Key" class="Models.Bases.ClientKey, Models">
<key-property name="Id" column="ID" type="int"/>
<key-property name="SiteId" column="clientID" type="int"/>
</composite-id>
<property name="Name" type="String">
<column name="`name`" length="500" sql-type="varchar" not-null="false"/>
</property>
</class>
哪个工作得很好,这里是id类:
public class ClientKey
{
public int Id { get; set; }
public int ClientId { get; set; }
}
public class Resource
{
public virtual ClientKey Key { get; set; }
public virtual string Name { get; set; }
}
如何使用FluentNhibernate重新映射?此代码不起作用:
WithTable("resource");
UseCompositeId()
.WithKeyProperty(x => x.Key.Id, "ID")
.WithKeyProperty(x => x.Key.ClientId, "clientID");
Map(x => x.Name);
它抛出此错误: 无法在“Models.Resource”类中找到属性“Id”的获取器
感谢!!!
答案 0 :(得分:1)
我担心如果不修改Resource类就无法修复它。我已经用Fluent NHibernate的源代码检查了 - 这是输出复合id部分的代码:
XmlElement element = classElement.AddElement("composite-id");
foreach( var keyProp in keyProperties )
{
keyProp.Write(element, visitor);
}
缺少的是“name”属性,该属性应设置为“Key”。没有这个属性,NHibernate回退到默认属性name =“Id”。由于您的类没有Id属性,因此NHibernate不知道该怎么做并抛出异常。
如果你不能修改Resource类,你必须为这个类使用hbm映射或创建一个流畅的nhibernate补丁(这可能是已知的问题,有人正在处理它 - 请参考流利的nhibernate的问题跟踪器)。