FluentNHibernate + Linq返回空列表

时间:2013-02-06 14:11:42

标签: linq nhibernate fluent-nhibernate linq-to-nhibernate fluent-nhibernate-mapping

问题

我似乎无法通过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;
        }
    }
}

0 个答案:

没有答案