我有两个简单的对象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
的键列我的问题是:
是否可以仅从表A中选择“BOject_id”列的值?
我想避免在这种特殊情况下加入,并在其他情况下使用引用的好处。
答案 0 :(得分:1)
您可以使用只读 A
属性扩展您的C#类BId
:
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 。这很重要,因为它将与引用BObject相同的列。
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();
}
现在你可以在没有加入的情况下得到它:
var test = session.Query<A>().Select(x => x.BId);
答案 1 :(得分:0)
您使用的是什么版本的NHibernate?我不能重现这个;我对类似关系的查询选择了外键。我正在使用3.3.1。
答案 2 :(得分:0)
你试过这个:
var test = session.Query<A>().Select(x => x.BObject).Select(x => x.BId);
NHibernate应该在没有连接的情况下为B创建代理,并且仅访问已创建代理的标识符不应该触发数据库访问。