Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate要求.NET将字符串参数转换为整数,不知道为什么_C#_.net_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# NHibernate要求.NET将字符串参数转换为整数,不知道为什么

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

编辑以避免走错路

在给出详细信息之前,非常简短的版本:我有一个SQL语句需要从NHibernate中获取,我有一个CriteriaAPI语句提供给我。NHibernate试图对它生成的语句做一些错误的处理,我试图找出原因

我在Fluent NHibernate中有以下映射:

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,而我不想这样做。