我偶然发现了一些意想不到的行为。我们的数据库中有一些引用不再存在。不知何故,即使在标准上使用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的这种行为,因为这会对查询造成严重影响。
先谢谢。