eul*_*rfx 3 nhibernate fluent-nhibernate
我正在使用:SQL Server Express 2008上的NHibernate,NHibernate.Linq和Fluent NHibernate.我选择了一个在引用属性上使用谓词的实体(多个映射).我有fetch = join,unique = true,lazy-load = false.我启用了log4net日志,当执行任何此类查询时,它会记录两个相同的SQL查询.运行查询返回一行,当我尝试使用IQueryable.Single扩展方法时,它会抛出异常,表明返回了多行.我也尝试使用标准的IQuery.UniqueResult方法运行查询,结果相同,它最终记录并实际运行查询两次,然后抛出一个异常,说明有多行,但是在管理工作室中运行实际查询只返回一个结果.当我禁用日志记录时,我收到相同的错误.
实体和映射声明如下(隐含了适当的访问修饰符和成员类型方差)
class User
{
int ID;
string UserName;
}
class Client
{
int ID;
User User;
Person Person;
Address Address;
}
class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x => x.ID);
Map(x => x.UserName);
}
}
class ClientMap : ClassMap<Client>
{
public ClientMap()
{
Id(x => x.ID);
References(x => x.User).Unique();
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我调用如下查询:
ISession s = GetNHibernateSession();
...
var client = s.Linq<Client>().SingleOrDefault(x => x.User.ID = 17);
or
var client = s.Linq<Client>().Where(x => x.User.ID = 17);
or
var client = s.CreateQuery("from Client as c where c.User.ID = 17").UniqueResult<Client>();
Run Code Online (Sandbox Code Playgroud)
在所有情况下执行两个相同的查询.当我启用延迟加载时,使用两个查询再次加载客户端,但是在访问成员(例如Person)时,只执行一个附加查询.
这可能是Fluent产生不正确映射的结果吗?或者NHibernate没有正确使用SQL Server Express版本?
问题是由我宣布的另一个映射引起的.我有一个继承自Client的类,它有一个关联的映射.这就是导致NHibernate查询两次的原因.我注意到了这一点,因为当使用Linq()时它返回了子类,而不是Client本身.这个特殊的继承和映射实例是我的设计缺陷,也是整个问题的根源!
| 归档时间: |
|
| 查看次数: |
958 次 |
| 最近记录: |