hibernate和MVC.查询中的空对象

本文关键字:对象 查询 MVC hibernate | 更新日期: 2023-09-27 18:14:20

所以我对使用NHibernate进行数据库访问相当陌生,并且在我正在编辑的应用程序中研究其在其他地方的使用后,我似乎无法让它为我工作,我不知道为什么。实际上,我正在尝试用数据库中的数据填充对象,以便我可以提取片段并将它们呈现给用户。问题是,尽管我的语法和代码看起来是正确的,但在执行查询后,我的对象仍然是空的。

在数据库中用来表示表的类:

public class AllocateLog
{
    public virtual string UserName { get; set; }
    public virtual int Id { get; set; }
    public virtual int OwnerId { get; set; }
    public virtual int MemberId { get; set; }
    public virtual int? ResId { get; set; }
    public virtual string RequestComments { get; set; }
    public virtual DateTime DateEntered { get; set; }
    public virtual DateTime? DateExited { get; set; }
    public virtual string EntryAccessPoint { get; set; }
    public virtual string ExitAccessPoint { get; set; }
}

映射代码:

    public class AllocateLogOverride : IAutoMappingOverride<AllocateLog>
{
    public void Override(AutoMapping<AllocateLog> map)
    {
#if LOCAL_INSTALL
        map.Schema("dbo");
#else
        map.Schema("cred");
#endif 
        map.Table("allocate_log");
        map.CompositeId()
                    .KeyProperty(x => x.OwnerId, "owner_id")
                    .KeyProperty(x => x.MemberId, "member_id")
                    .KeyProperty(x => x.DateEntered, "date_entered");
        map.Map(x => x.UserName).Column("user_name");
        map.Map(x => x.ResId).Column("res_id");
        map.Map(x => x.RequestComments).Column("request_comments");
        map.Map(x => x.DateExited).Column("date_exited");
        map.Map(x => x.EntryAccessPoint).Column("entry_access_point");
        map.Map(x => x.ExitAccessPoint).Column("exit_access_point");
    }
}
查询代码:
    public class AllocateLogsForAccessPoints : IQuery<IQueryOver<AllocateLog>, AllocateLog>
{
    private readonly string accessPoint;
    public AllocateLogsForAccessPoints(string accessPoint)
    {
        this.accessPoint = accessPoint;
    }
    public IQueryOver<AllocateLog> BuildQuery(ISession session)
    {
        return session.QueryOver<AllocateLog>()
            .Where(d => d.EntryAccessPoint == accessPoint);
    }
    public AllocateLog Execute(IQueryOver<AllocateLog> query)
    {
        return query.SingleOrDefault();
    }
}

和代码,我正在使用的只是一个测试,看看我的查询是否会返回任何东西到我的对象:

var asdf = DbQueryExecutor.ExecuteQuery(new AllocateLogsForAccessPoints((string)"north gate"));

数据库中只有一条记录符合该查询,因为它是数据库中唯一具有entry_access_point中任何数据的行,字符串是"north gate"。这张桌子是铺好的。在映射文件中正确命名了Allocate_log和所有列。此外,删除映射文件或注释掉它不会导致任何运行时错误,这意味着对我来说,NHibernate甚至从来没有尝试使用映射文件,因为如果我试图这样做(意思是注释掉文件的内容)与任何其他映射文件的查询工作,我得到一个运行时错误。所以我完全被难住了,为什么我的对象在执行查询后仍然为空,没有错误。什么好主意吗?如果你需要更多的信息,我会更新我原来的帖子。

hibernate和MVC.查询中的空对象

您可以尝试从Hibernating Rhinos下载一个名为NHProf的应用程序。它跟踪所有nHibernate调用,并准确地显示nHibernate试图运行的SQL。对于我来说,这是一个天赐之物,我试图弄清楚nHibernate到底在做什么。

我的问题的答案是检查与查询相关的各种文件的名称空间和位置。我最初将其中一个文件放在错误的文件夹中,因此名称空间被映射到那个错误的文件夹。我将文件移动到正确的文件夹中,但从未更改名称空间。因此,在覆盖文件中,我有一个对名称空间说它是其中一部分的文件夹的引用,而实际上它不是。纠正这些错误是解决办法。