gpt4 book ai didi

nhibernate - 如何使用 NHibernate 联合子类映射抽象属性?

转载 作者:行者123 更新时间:2023-12-04 01:13:16 27 4
gpt4 key购买 nike

这里指的是 Ayende 的帖子: http://ayende.com/blog/3941/nhibernate-mapping-inheritance

我有一个类似的情况,可以通过向 Party 添加一个抽象的 Name-property 来稍微扩展上面帖子的联合子类映射来实现。模型如下:

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,而是使用来自公司联合子类的映射。因此,当使用 Party 进行参数化时,查询似乎与使用 Company 进行参数化时基本相同(查询的 WHERE 子句是:WHERE this_.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 - 如何使用 NHibernate 联合子类映射抽象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com