【问题标题】:How do I access a view using Fluent NHibernate?如何使用 Fluent NHibernate 访问视图?
【发布时间】:2011-02-08 01:40:24
【问题描述】:

我的网络应用程序使用了六个表,当用户通过系统时,每个表都会被填充。为了进行统计分析,我编写了一个数据库视图来将这些表扁平化为一个视图。

视图正在运行,但是,我想围绕视图创建自动化一些测试。

我这样做的想法是为视图创建一个模型/地图和存储库 - 仅使用列表操作。我当前的实现不起作用。

这是我的存储库:

namespace FunctionalTests.SpssView
{
    public class SpssRepository
    {
        private readonly ISessionManager _sessionManager;

        public SpssRepository(ISessionManager sessionManager)
        {
            _sessionManager = sessionManager;
        }

        public IList<Spss> ListFromSpssView()
        {
            ICriteria criteria = _sessionManager.GetSession().CreateCriteria(typeof(Spss));
            return criteria.List<Spss>();
        }
    }
}

这是模型类:

namespace FunctionalTests.SpssView
{
    public class Spss
    {
        public virtual String StudentId { get; set; }
        public virtual String UPNSCN { get; set; }
        ...
    }
}

还有映射:

namespace FunctionalTests.SpssView
{
    public sealed class SpssMap : ClassMap<Spss>
    {
        public SpssMap()
        {
            Id(x => x.StudentId).GeneratedBy.Assigned();
            Map(x => x.UPNSCN);
            ...
        }
    }
}

我对 ID 映射并不完全有信心 - 因为它只是从视图中读取的?

这是我的测试:

    [Test]
    public void ShouldPopulateAndRetrieveFromSpssView()
    {   
        var mockSessionManager = new Mock<ISessionManager>();
        mockSessionManager.Setup(x => x.GetSession()).Returns(_session);

        var caseRepository = new CaseRepository(mockSessionManager.Object);
        var caseList = caseRepository.ListCases();
        Assert.That(caseList.Count, Is.EqualTo(2));

        var repository = new SpssRepository(mockSessionManager.Object);

        var spssList = repository.ListFromSpssView();

        Assert.That(spssList.Count, Is.EqualTo(2));
    }   

注意案例列表代码 - 我把它放在那里以确保正在建立数据库连接。这部分测试通过了。

运行 select * from spss;返回两个结果。 (我使用的是 sql server 2005 fwiw)

因为这不是生产代码,所以我在我的 FunctionalTests Visual Studio 项目中创建了一个新文件夹(我提到了这一点,因为在我看来它是这个和我的工作存储库之间的主要区别之一。)有所作为??

是否可以像这样测试视图? 无论如何我可以看到正在生成的sql吗? 我做错了什么??!?

谢谢:)

【问题讨论】:

    标签: c# orm fluent-nhibernate


    【解决方案1】:

    尝试添加:

        public SpssMap()
        {
           Table("myViewBame"); // ADD THIS
            Id(x => x.StudentId).GeneratedBy.Assigned();
            Map(x => x.UPNSCN);
            ...
        }
    

    要查看生成的 SQL,请添加:

    .ShowSql()
    

    例如:

    Fluently.Configure().Database(
                            MsSqlConfiguration.MsSql2005
                                .ConnectionString(
                                    ConfigurationManager.ConnectionStrings["my"].ConnectionString).ShowSql())
                            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyClass>())
                            .BuildSessionFactory();
    

    【讨论】:

    • 谢谢!对表的更改没有任何区别,但是 SqlShow 让我看到我的存储库根本没有访问数据库。我已经将代码移到了公共项目中,并且一切正常……明天我将调查到底是为什么!再次干杯:)
    • 我的荣幸!如果将类命名为视图,则没有任何区别,但请再次发布,我可能会提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多