代码之家  ›  专栏  ›  技术社区  ›  Chris Conway

在fluent nhibernate中,如何使用带有类的复合id作为id字段?

  •  0
  • Chris Conway  · 技术社区  · 15 年前

    我有这样一个映射文件:

    <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>
    

    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”的getter

    谢谢!!!

    1 回复  |  直到 15 年前
        1
  •  1
  •   harriyott Erik Funkenbusch    12 年前

    如果不修改资源类,恐怕无法修复它。我已经查阅了Fluent NHibernate的源代码-下面是输出复合id部件的代码:

    XmlElement element = classElement.AddElement("composite-id");
    foreach( var keyProp in keyProperties )
    {
      keyProp.Write(element, visitor);
    }
    

    缺少的是“name”属性,该属性应设置为“Key”。如果没有此attibute,NHibernate将回退到默认属性name=“Id”。由于您的类没有Id属性,NHibernate不知道该做什么并抛出异常。

    如果您不能修改资源类,则必须对此类使用hbm映射或创建到fluent nhibernate的修补程序(这可能是已知的问题,并且有人正在处理它-请参阅fluent nhibernate的问题跟踪程序)。