NHibernate在缺少关系时做了额外的选择,即使使用了渴望的提取

时间:2011-06-29 09:13:54

标签: nhibernate nhibernate-criteria

我偶然发现了一些意想不到的行为。我们的数据库中有一些引用不再存在。不知何故,即使在标准上使用Eager加载,NHibernate也会对不存在的关系进行额外的选择查询。

数据库布局: 请注意,Order表中的UserId 3在User表中不再存在。

TableName: Order
+----+-----------+--------+
| Id | OrderName | UserId |
+----+-----------+--------+
| 1  | OrderA    | 1      |
| 2  | OrderB    | 2      |
| 3  | OrderC    | 3      |  
+-------------------------+  

TableName: User
+----+-----------+
| Id | UserName  |
+----+-----------+
| 1  | User1     |
| 2  | User2     |
+----------------+

使用Fluent NHibernate进行NHibernate映射:

public class User
{
    public virtual int Id { get; set; }
    public virtual string UserName { get; set; }
}

public class Order
{
    public virtual int Id { get; set; }
    public virtual string OrderName { get; set; }
    public virtual User User { get; set; }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.UserName);
    }
}

public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(x => x.Id);
        Map(x => x.OrderName);
        References(x => x.User).NotFound.Ignore();
    }
}

关于订单渴望提取用户的NHibernate标准:

var orders = session.CreateCriteria<Order>()
    .SetFetchMode("User", FetchMode.Eager)
    .List<Order>();

输出结果:

NHibernate: SELECT this_.Id as Id0_1_, this_.OrderName as OrderName0_1_, this_.U
ser_id as User3_0_1_, user2_.Id as Id1_0_, user2_.UserName as UserName1_0_ FROM
[Order] this_ left outer join [User] user2_ on this_.User_id=user2_.Id

NHibernate: SELECT user0_.Id as Id1_0_, user0_.UserName as UserName1_0_ FROM [Us
er] user0_ WHERE user0_.Id=@p0;@p0 = 3 [Type: Int32 (0)]

正如你所看到的,NHibernate对用户引用无法找到第二个查询,即使我确实在User表上进行了连接,因此它应该知道该记录不存在。当我们使用遗留数据库时,此时无法修复数据库中所有缺失的关系。 是否可以选择阻止NHibernate的这种行为,因为这会对查询造成严重影响。

先谢谢。

0 个答案:

没有答案
相关问题