【问题标题】:NHibernate - reference without (always) doing SQL joinNHibernate - 没有(总是)做 SQL 连接的参考
【发布时间】:2012-01-26 22:56:32
【问题描述】:

我有一个问题可能带有代码/设计的臭味,但我还是要问它。

假设我有以下两个微不足道的类:

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,我通常会写一些类似的 SQL

SELECT * 
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 没有连接?这个例子很简单,但在我的实际情况下,要加入的表有数百万行,所以我想尽可能避免加入。

提前致谢!

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    如果ZipCodeStreetAddress 字段实际上在Person 表中,那么您需要将PostOffice 映射为Component 而不是Reference

    http://wiki.fluentnhibernate.org/Auto_mapping#Components

    编辑:

    您可以将单独的属性映射到该 ZipCode 字段。

    public class Person
    {
        public virtual in ID {get; protected set;}
        public virtual string FirstName {get; set;}
        public virtual string LastName {get; set;}
        public virtual string ZipCode { get; set; }
        public virtual PostOffice PostOffice {get; set;}
    }
    
    model.Override<Person>(p=> 
        p.References( z=> z.PostOffice, "ZipCode")
         .Not.Update()
         .Not.Insert()
    );
    

    【讨论】:

    • 不是我的实际情况,不是。对于我的实际情况,ZipCode 是唯一的共享列,而 PostOffice 表还有另外 80 个左右的列(遗留结构......)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多