0

因此,我对使用 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”。该表是 cred.allocate_log 并且所有列在映射文件中都正确命名。此外,删除映射文件或者将其注释掉不会导致任何运行时错误,这对我来说意味着 NHibernate 甚至从未尝试使用映射文件,因为如果我尝试这样做(意味着注释掉文件的内容)对于任何其他查询有效的映射文件,我都会遇到运行时错误。所以我完全不知道为什么我的对象在执行运行没有错误的查询后仍然为空。有任何想法吗?如果您需要更多信息,我将更新我的原始帖子。

4

2 回答 2

1

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

于 2013-05-20T18:50:47.867 回答
0

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

于 2013-05-22T12:15:07.527 回答