我正在研究一个非常复杂的遗留数据库 表客户与供应商共享,创建此结构的人使用标志来标识客户。 由于我只对使用定义为客户的记录感兴趣,因此我在映射中添加了where子句:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
<class name="Customer" table="ANSADID" mutable="false" where="ANFCLI = 'Y'">
<composite-id>
<key-property name="CustomerCode" column="ANCOCO" type="String" length="10"></key-property>
<key-property name="Company" column="ANCOSO" type ="String" length="5"></key-property>
</composite-id>
<property name="Name" column="ANINCO" type="String" length="100"></property>
</class>
</hibernate-mapping>
正如您所看到的,我已使用此子句预先过滤了所有客户:ANFCLI = 'Y'
如果我查询客户(使用where子句),一切都运行得很好:
var customers = session.QueryOver<Domain.Customer>()
.Where(t => t.Company == "ABC01")
.List();
但是,如果我查询订单表 - 我有一个多对一的关联:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
<class name="Order" table="OCSAORH" mutable="false" where="OCHAMND = 0">
<composite-id>
<key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
<key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
<key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
</composite-id>
<many-to-one name="Customer" class="Customer" lazy="proxy" fetch="join">
<column name="OCHCLII" not-null="true"/>
<column name="OCHCOSC" not-null="true"/>
</many-to-one>
</class>
</hibernate-mapping>
实体客户的过滤器丢失 我正在读某处where子句不能用于关联,你必须在集合中使用where子句(包,集等等),但是,我怎么能用多对一来做呢? / p>
谢谢你的帮助。
答案 0 :(得分:1)
如何使用ANFCLI使用鉴别器映射客户,然后将鉴别器值设置为“Y”。我认为NHibernate会比where子句更加严格地对待它。
<class name="Customer" table="ANSADID" mutable="false" discriminator-value="Y">
<composite-id>
<key-property name="CustomerCode" column="ANCOCO" type="String" length="10" />
<key-property name="Company" column="ANCOSO" type ="String" length="5" />
</composite-id>
<discriminator column="ANFCLI" />
<property name="Name" column="ANINCO" type="String" length="100" />
</class>
答案 1 :(得分:1)
我觉得脱胶是对的: 您需要有一个名为“Person”的超类,以及两个名为“Customer”和“Supplier”的子类型。 然后设置映射,使其使用ANFCLI字段作为鉴别器,使用Customer的Y值和Supplier的N值。 这样,您将拥有一个漂亮而透明的多态性。 (您将能够执行“来自客户”或“来自供应商”之类的操作,并且会自动添加where子句。
希望有所帮助!
答案 2 :(得分:0)
我也是使用NHibernate的新手,但也许你可以使用一个包来映射这种关系(Order to Customer)(好像它会是一对多的)!