0

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

我的问题是:

是否可以仅从表 A 中选择“BOject_id”列的值?

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

4

2 回答 2

1

A您可以使用只读 BId属性扩展您的 C# 类:

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);
于 2013-01-15T10:45:25.457 回答
0

你有没有试过这个:

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

在这种情况下,NHibernate 应该为 B 创建代理而不连接,并且仅访问已创建代理的标识符不应触发 DB 访问。

于 2013-04-04T08:04:45.807 回答