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