如何在一个流畅的nhibernate中使用带有类的复合id作为id字段?

时间:2009-07-29 21:13:44

标签: fluent-nhibernate nhibernate-mapping

我有一个这样的映射文件:

<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”的获取器

感谢!!!

1 个答案:

答案 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的问题跟踪器)。