3

ここでAyendeの投稿を参照してください:http: //ayende.com/blog/3941/nhibernate-mapping-inheritance

パーティーに抽象的な名前プロパティを追加することで、上記の投稿のユニオンサブクラスマッピングを少し拡張することで到達できる同様の状況があります。モデルは次のようになります。

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();

私が使用しているマッピング:

<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<Company>().Where(p => p.Name.IsLike("companyName")).List();

これは期待どおりに動作し、名前をクエリして一致する結果を取得できます。しかし、私がするとき

session.QueryOver<Party>().Where(p => p.Name.IsLike("firstname lastname")).List();

クエリはPersonsとはまったく一致しませんが、会社のunion-subclassからのマッピングを使用します。したがって、Partyでパラメーター化された場合、クエリはCompanyでパラメーター化された場合と基本的に同じように見えます(クエリのWHERE句は次のとおりです。WHEREthis_.company_name =((E'firstname lastname'):: text))

私がどこで間違っているのか、そして私が求めていることをどのように達成するのかについての指針はありますか?

4

2 に答える 2

0

これは、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; }
}
于 2012-10-08T05:17:26.373 に答える
0

どうやらこれはNHibernate3.xの既知の問題です: https ://nhibernate.jira.com/browse/NH-2354?page = com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

于 2012-10-13T13:52:44.370 に答える