C# NHibernate要求.NET将字符串参数转换为整数,不知道为什么
编辑以避免走错路 在给出详细信息之前,非常简短的版本:我有一个SQL语句需要从NHibernate中获取,我有一个CriteriaAPI语句提供给我。NHibernate试图对它生成的语句做一些错误的处理,我试图找出原因 我在Fluent NHibernate中有以下映射:C# NHibernate要求.NET将字符串参数转换为整数,不知道为什么,c#,.net,nhibernate,fluent-nhibernate,C#,.net,Nhibernate,Fluent Nhibernate,编辑以避免走错路 在给出详细信息之前,非常简短的版本:我有一个SQL语句需要从NHibernate中获取,我有一个CriteriaAPI语句提供给我。NHibernate试图对它生成的语句做一些错误的处理,我试图找出原因 我在Fluent NHibernate中有以下映射: public class StaffClass { public virtual int Staff_DBID { get; private set; } public virtual int Class_D
public class StaffClass {
public virtual int Staff_DBID { get; private set; }
public virtual int Class_DBID { get; private set; }
// Equals and GetHasCode overrides not shown
// other code originally here removed as it was distracting from the point and didn't change anything
}
public class StaffClassMap : ClassMap<StaffClass> {
public StaffClassMap() {
CompositeId()
.KeyProperty(x => x.Staff_DBID)
.KeyProperty(x => x.Class_DBID);
}
}
现在最让我恼火的是,生成的SQL正是我想要的SQL。如果我在SQL Server ManageMeent Studio SQL 2008中使用手动参数替换运行SQL,我会得到一个正确的结果集:
SELECT
this_.Student_DBID as Student1_7_0_,
this_.DistrictStudentID as District2_7_0_,
this_.LastName as LastName7_0_,
this_.FirstName as FirstName7_0_,
this_.MidName as MidName7_0_,
this_.School_DBID as School6_7_0_
FROM
[Student] this_
WHERE
Student_DBID in (
SELECT
this_0_.Student_DBID as y0_
FROM
[ClassStudent] this_0_
WHERE Class_DBID in (
SELECT
this_0_0_.Class_DBID as y0_
FROM
[StaffClass] this_0_0_
WHERE
this_0_0_.Staff_DBID = 3664
)
)
尝试的参数转换来自何处?为什么会这样?我能做些什么来避免这个问题
谢谢 对于初学者,您需要两次映射ID列:作为引用,作为复合ID的一部分 这是错误的,您应该使用相当于的fluent映射id成员 但还有更多。。。如果这个类没有任何数据,为什么要映射它呢 最好在课堂上安排一组工作人员,反之亦然 我假设你的问题是向学生征求教职员工的意见 型号:
public class Student : Entity<Guid>
{
}
public class Staff : Entity<Guid>
{
}
public class Class : Entity<Guid>
{
public virtual ICollection<Student> Students { get; set; }
public virtual ICollection<Staff> Staff { get; set; }
}
这些集合上的映射只是多对多,所以我将省略它
使用HQL进行查询比使用条件容易得多:
var students = session.CreateQuery("see the query below")
.SetParameter("staff", id)
.List<Student>();
from Student s
where s in
(select elements(c.Students)
from Class c
where :staff in elements(c.Staff))
首先,您要映射两次ID列:作为引用和复合ID的一部分 这是错误的,您应该使用相当于的fluent映射id成员 但还有更多。。。如果这个类没有任何数据,为什么要映射它呢 最好在课堂上安排一组工作人员,反之亦然 我假设你的问题是向学生征求教职员工的意见 型号:
public class Student : Entity<Guid>
{
}
public class Staff : Entity<Guid>
{
}
public class Class : Entity<Guid>
{
public virtual ICollection<Student> Students { get; set; }
public virtual ICollection<Staff> Staff { get; set; }
}
这些集合上的映射只是多对多,所以我将省略它
使用HQL进行查询比使用条件容易得多:
var students = session.CreateQuery("see the query below")
.SetParameter("staff", id)
.List<Student>();
from Student s
where s in
(select elements(c.Students)
from Class c
where :staff in elements(c.Staff))
为了结束这个问题,我放弃了说服NHibernate做我想做的事。我决定改为使用通用SQL解析器和真正的命令和连接提供程序的包装器。出于不同原因的类似任务在中进行了说明。无论如何,这避免了整个问题,因为它迫使我在SQL级别上工作,这不仅让我可以做我想做的事情,而无需NHibernate的阻挠,而且还允许拦截HQL甚至直接数据库访问。为了结束这个问题,我放弃了说服NHibernate做我想做的事情。我决定改为使用通用SQL解析器和真正的命令和连接提供程序的包装器。出于不同原因的类似任务在中进行了说明。在任何情况下,这都避免了整个问题,因为它迫使我在SQL级别工作,这不仅让我可以在不受NHibernate妨碍的情况下做我想做的事情,而且还允许拦截HQL甚至直接数据库访问。感谢您的回答。我不知道如何在不将联接表作为显式实体添加的情况下执行所需的SQL语句。我已经删除了额外的参考资料,这只是一种方便,它不会改变任何事情。我应该提到的是,这是一个遗留数据库,因此添加代理密钥而不是复合密钥等选项不是一个选项。多对多存在于适当的域对象中。不过,这并没有告诉我这里出了什么问题。看起来您正试图像使用数据集一样使用NHibernate,基于列进行映射。我将尝试在答案中添加一些外观更好的代码。实际上,这个类已经有了您为学生和教职员工引用显示的映射,这是可以正常工作的。我需要能够在运行时更改查询,而且CriteriaAPI似乎是正确的方法,否则我必须解析HQL,这是我不想做的。谢谢你的回答。我不知道如何在不将联接表作为显式实体添加的情况下执行所需的SQL语句。我已经删除了额外的参考资料,这只是一种方便,它不会改变任何事情。我应该提到的是,这是一个遗留数据库,因此添加代理密钥而不是复合密钥等选项不是一个选项。多对多存在于适当的域对象中。不过,这并没有告诉我这里出了什么问题。看起来您正试图像使用数据集一样使用NHibernate,基于列进行映射。我将尝试在答案中添加一些外观更好的代码。实际上,这个类已经有了您为学生和教职员工引用显示的映射,这是可以正常工作的。我需要能够在运行时更改查询,而CriteriaAPI似乎是正确的方法,否则我必须解析HQL,而我不想这样做。