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?
我想在这种特殊情况下避免连接,而在其他情况下使用引用的好处。
你可以用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的访问。