我似乎无法通过Fluent NHibernate配置将我的Linq查询与NHIbernate一起使用。
我正在尝试调试,但每次看起来连接成功打开并执行了一个事务,但返回是一个空列表。
我检查了this SO post,但该作者的解决方案(确保地图是公开的)并没有解决我的问题(虽然我确实也遇到了这个问题,但事实证明。)
注意:我构建并返回了一个虚拟列表,试图将问题隔离到NHibernate。此外,通过StructureMap使用依赖注入,并在传入我的测试存储库时传递所有单元测试。
NHibernateHelper.cs - 构建会话工厂
现在使用硬编码的连接字符串进行调试。敏感信息编辑。
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using PEApps.Model.WorkorderQuery;
namespace PEApps.Data
{
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
_sessionFactory = Fluently.Configure()
.Database(
OracleDataClientConfiguration.Oracle10.ConnectionString(c => c.Is("Data Source=DSRedacted;User Id=UserRedacted;Password=PasswordRedacted;")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<WorkorderBrief>())
.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
WorkorderBriefNHRepository.cs - 包含我的GetAll()方法的回购。
注意:截断只显示GetAll()方法,这是唯一被调用的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using PEApps.Model.WorkorderQuery;
using NHibernate.Linq;
using NHibernate;
namespace PEApps.Data
{
public class WorkorderBriefNhRepository : IWorkorderBriefRepository
{
public List<WorkorderBrief> GetAll()
{
using (var session = NHibernateHelper.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var query = session.Query<WorkorderBrief>().Take(20).ToList();
transaction.Commit();
return query;
}
}
}
}
}
WorkorderBriefNhMap.cs - 我的流利地图文件
using FluentNHibernate.Mapping;
using PEApps.Model.WorkorderQuery;
namespace PEApps.Data
{
public class WorkorderBriefNhMap : ClassMap<WorkorderBrief>
{
public WorkorderBriefNhMap()
{
Schema("MAXIMO");
Table("WORKORDER");
Id(x => x.Id).Column("WORKORDERID").Not.Nullable();
Map(x => x.WorkorderNumber).Column("WONUM");
Map(x => x.DateReported).Column("REPORTDATE");
Map(x => x.DateLastUpdated).Column("CHANGEDATE");
Map(x => x.Requestor).Column("WO7");
Map(x => x.Title).Column("DESCRIPTION");
Map(x => x.Location);
Map(x => x.Status);
}
}
}
WorkorderQueryController.cs - 创建一个简单的ViewModel以传递给视图的控制器。
using System.Web.Mvc;
using PEApps.Data;
using PEApps.Model.WorkorderQuery;
using PEApps.Web.Infrastructure;
namespace PEApps.Web.Controllers
{
public class WorkorderQueryController : Controller, IWorkorderQueryController
{
private IWorkorderBriefRepository _repository;
public WorkorderQueryController(IWorkorderBriefRepository repository)
{
_repository = repository;
}
//
// GET: /WorkorderQuery/
public ViewResult Index()
{
var model = new WorkorderQueryViewModel();
model.TheType = _repository.GetType().ToString();
model.TheWorkorders = _repository.GetAll();
return View(model);
}
}
}
为了完整性,我的StructureMap设置(如果它的默认方式有问题吗?)
using PEApps.Data;
using StructureMap;
namespace PEApps.Web {
public static class IoC {
public static IContainer Initialize() {
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.For<IWorkorderBriefRepository>().Use<WorkorderBriefNhRepository>();
});
return ObjectFactory.Container;
}
}
}