我有一个问题,可能是代码/设计很臭,但我还是会问它。
说我下面有两个琐碎的课程:
public class PostOffice
{
public virtual string ZipCode {get; set;}
public virtual string StreetAddress {get; set;}
}
public class Person
{
public virtual in ID {get; protected set;}
public virtual string FirstName {get; set;}
public virtual string LastName {get; set;}
public virtual PostOffice ZipCode {get; set;}
}
我已经使用FluentNHibernate将PostOffice.ZipCode设置为ID,并在下面提供了映射覆盖:
model.Override<Person>(p=> p.References( z=> z.ZipCode, "ZipCode"));
数据库中的Person.ZipCode只是一个VARCHAR,我通常会写一些像
的SQLSELECT *
FROM Person
WHERE ZipCode = '90210'
但如果我有一个NHibernate会话并执行以下操作:
session.Query<Person>().Where(p=>p.ZipCode == '90210')
生成的SQL(漂亮打印)看起来像
SELECT p.*
FROM Person p INNER JOIN PostOffice o
ON p.ZipCode = o.ZipCode
WHERE o.ZipCode = '90210'
我的问题 - 如果实体默认是延迟加载,是否可以指定一些映射属性,以便NHibernate生成SQL 而不用连接?这个例子很简单,但在我的实际情况中,连接的表有数百万行,所以我想尽可能避免连接。
提前致谢!
答案 0 :(得分:0)
如果字段ZipCode
和StreetAddress
实际位于Person
表中,则您需要将PostOffice
映射为Component
而不是{{1} }}
http://wiki.fluentnhibernate.org/Auto_mapping#Components
您可以将单独的属性映射到该ZipCode字段。
Reference