NHibernate -从没有连接的引用列中选择Id

本文关键字:引用 选择 Id 连接 NHibernate | 更新日期: 2023-09-27 17:53:03

我有两个简单的对象A和b。对象A对对象b有一个引用。

public class A
{
    public virtual Guid AId { get; set; }
    public virtual string Name { get; set; }
    public virtual B BObject { get; set; }
}
public class B
{
    public virtual Guid BId { get; set; }
    public virtual string Name { get; set; }
}

我用Fluent-NHibernate映射了这两个对象:

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Id(x => x.AId);
        Map(x => x.Name);
        References<B>(x => x.BObject);
    }
}
public class BMap : ClassMap<B>
{
    public BMap()
    {
        Id(x => x.BId);
        Map(x => x.Name);
    }
}

创建数据库后,我得到两个表。A的表有一个额外的列'BObject_id'。

我有一个特殊的情况,我只需要选择引用对象B的id。我用LINQ来选择这个

var test = session.Query<A>().Select(x => x.BObject.BId);

生成sql查询(我使用的是MSSQL2012):

select b1_.BId as col_0_0_ from iadb.[A] a0_ left outer join iadb.[B] b1_ on a0_.BObject_id=b1_.BId

Hibernate首先连接两个表,然后选择B的key列

我的问题是:

是否可以只选择列'BOject_id'的值从表A?

我想在这种特殊情况下避免连接,而在其他情况下使用引用的好处。

NHibernate -从没有连接的引用列中选择Id

你可以用readonly BId属性扩展你的c#类A:

public class A
{
    public virtual Guid AId { get; set; }
    public virtual string Name { get; set; }
    public virtual B BObject { get; set; }
    public virtual Guid BId { get; set; } // virtual "navigational" property
}

映射为readonly。这很重要,因为它将作为引用对象针对同一列。

public AMap()
{
  Id(x => x.AId);
  Map(x => x.Name);
  References<B>(x => x.BObject)
    .Column("BOject_id");
  Map(x => x.BId)
    .Column("BOject_id") // the same column names
    .ReadOnly();
}

现在你不需要join就可以得到它了:

var test = session.Query<A>().Select(x => x.BId);

你试过了吗:

var test = session.Query<A>().Select(x => x.BObject).Select(x => x.BId);

在这种情况下,NHibernate应该为B创建不带join的代理,并且仅使用已创建代理的访问标识符不应该触发对DB的访问。