NHibernate - 从参考列中选择Id而不加入

时间:2013-01-15 09:40:46

标签: c# linq nhibernate reference fluent-nhibernate

我有两个简单的对象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”列的值?

我想避免在这种特殊情况下加入,并在其他情况下使用引用的好处。

3 个答案:

答案 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创建代理,并且仅访问已创建代理的标识符不应该触发数据库访问。