如何将抽象属性映射到NHibernate联合子类?

如何将抽象属性映射到NHibernate联合子类?,nhibernate,orm,union-subclass,Nhibernate,Orm,Union Subclass,这里指的是Ayende的帖子: 我有一个类似的情况,可以通过稍微扩展上面文章的union子类映射,向Party添加一个抽象名称属性来实现。模式如下: public abstract class Party { public abstract string Name { get; } } public class Person : Party { public override string Name { get { return this.FirstName + " " +

这里指的是Ayende的帖子:

我有一个类似的情况,可以通过稍微扩展上面文章的union子类映射,向Party添加一个抽象名称属性来实现。模式如下:

public abstract class Party
{
    public abstract string Name { get; }
}

public class Person : Party
{
    public override string Name { get { return this.FirstName + " " + this.LastName; } }

    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

public class Company : Party
{
    public override string Name { get { return this.CompanyName; } }
    public virtual string CompanyName { get; set; }
}
我正在寻找一个映射,该映射允许我以以下方式查询各方:

session.QueryOver<Party>().Where(p => p.Name.IsLike("firstname lastname")).List();
session.QueryOver().Where(p=>p.Name.IsLike(“firstname-lastname”)).List();
我正在使用的映射:

<class name="Party" table="`party`" abstract="true">
<id access="backfield" name="Id">
  <column name="Id" />
  <generator class="sequence">
    <param name="sequence">party_id_seq</param>
  </generator>
</id>
<union-subclass name="Person" table="`person`">
  <property name="Name" formula="first_name || ' ' || last_name" update="false" insert="false" access="readonly">
  </property>
  <property name="FirstName">
    <column name="first_name" />
  </property>
  <property name="LastName">
    <column name="last_name" />
  </property>
</union-subclass>
<union-subclass name="Company" table="`company`">
  <property name="Name" access="readonly" update="false" insert="false">
    <column name="company_name" />
  </property> 
  <property name="CompanyName">
    <column name="company_name" />
  </property>
</union-subclass>

当事人身份证
两者皆有

session.QueryOver<Person>().Where(p => p.Name.IsLike("firstname lastname")).List();
session.QueryOver().Where(p=>p.Name.IsLike(“firstname-lastname”)).List();

session.QueryOver().Where(p=>p.Name.IsLike(“companyName”)).List();
这和我预期的一样,我可以查询名称并获得匹配结果。然而,当我

session.QueryOver<Party>().Where(p => p.Name.IsLike("firstname lastname")).List();
session.QueryOver().Where(p=>p.Name.IsLike(“firstname-lastname”)).List();
查询与Persons根本不匹配,而是使用公司的union子类的映射。因此,当使用Party参数化时,查询与使用Company参数化时基本相同(查询的WHERE子句是:WHERE this_u.Company_name=((E'firstname lastname')::text))


是否有任何关于我可能出错的地方以及如何实现我的目标的指示?

这可能是因为您使用的是属性内部的逻辑,而NHibernate无法确定。由于您已经为“名称”字段定义了公式,因此最好将其保留为标准属性。因此,如果您按照以下方式更正实体,它应该会起作用

public abstract class Party
{
    public abstract string Name { get; }
}

public class Person : Party
{
    public virtual string Name { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

public class Company : Party
{
    public virtual string Name { get; set; }
    public virtual string CompanyName { get; set; }
}

显然,这是NHibernate 3.x的一个已知问题:

我尝试过这种方法,但不幸的是,这种行为没有改变。我尝试在被重写的属性上使用属性访问向抽象名称添加setter(重写时需要这样做),以及在仅重写getter而不重写setter时使用支持字段的字段访问。
public abstract class Party
{
    public abstract string Name { get; }
}

public class Person : Party
{
    public virtual string Name { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

public class Company : Party
{
    public virtual string Name { get; set; }
    public virtual string CompanyName { get; set; }
}