Nhibernate和MVC。来自查询的空对象

时间:2013-05-20 12:58:28

标签: c# asp.net-mvc nhibernate fluent-nhibernate

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

用于表示数据库中表的类:

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甚至从未尝试使用映射文件,因为如果我尝试这样做(意味着注释掉文件的内容)与查询有效的任何其他映射文件一样,我收到运行时错误。所以我完全难以理解为什么我的对象在执行无错误运行的查询后仍为null。有任何想法吗?如果您需要更多信息,我会更新我的原始帖子。

2 个答案:

答案 0 :(得分:1)

您可以尝试从Hibernating Rhinos下载名为NHProf的应用程序。它跟踪所有nHibernate调用,并向您显示nHibernate正在尝试运行的SQL。在试图找出nHibernate试图做的事情时,这对我来说是天赐之物。

答案 1 :(得分:0)

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