【问题标题】:How to debug Fluent nHibernate如何调试 Fluent nHibernate
【发布时间】:2010-06-08 11:07:07
【问题描述】:

我在使用 Fluent nHibernate 时遇到了一些问题。我在表中添加了一列,我认为我已经正确更改了映射和连接的数据对象以正确反映这一点。但是,当我再次尝试运行我的应用程序时,我不断收到此错误:

System.Data.SqlClient.SqlException: Invalid column name 'Workflow_id'.

我真的看不出我所做的更改有什么问题,所以我从源代码管理恢复到映射和数据对象文件的原始版本,并从数据库中删除了有问题的列。但我仍然遇到同样的错误。

我想要一些关于如何调试它的建议。报告错误的 SQL 是半无意义的:

SELECT regions0_.Page_id as Page5_1_, regions0_.Id as Id1_, regions0_.Id as Id27_0_, regions0_.RegionId as RegionId27_0_, regions0_.RegionTemplate_id as RegionTe3_27_0_, regions0_.Workflow_id as Workflow4_27_0_ FROM [Region] regions0_ WHERE regions0_.Page_id=?

而且它无论如何都不会作为有效的 SQL 执行。

关于从这里去哪里有什么想法吗?

【问题讨论】:

    标签: nhibernate fluent


    【解决方案1】:

    我认为你不需要调试 FluentNhibernate。问题可能出在您的约定中。

    据我了解,您有一个对象区域,它被引用到其他对象工作流。 因此,为所有参考链接 e.q. 设置一个约定:

            private  Action<IConventionFinder> GetConventions() 
            {
                return c =>
                    { 
                        c.Add<PrimaryKeyConvention>();
                        c.Add<ReferenceConvention>();
                        c.Add<HasManyConvention>();
                        c.Add<TableNameConvention>();
                        c.Add<PropertyNameConvention>();
                    };
            }
    

    在你的实现中使用这个私有方法

     public AutoPersistenceModel Generate()
    

    参考约定应该是这样的:

    using FluentNHibernate.Conventions;
    using FluentNHibernate.Conventions.Instances;
    
    public class ReferenceConvention : IReferenceConvention
    {
        public void Apply(IManyToOneInstance instance)
        {
            instance.Column(Inflector.Net.Inflector.Camelize(instance.Property.Name) + "Id");
        }
    }
    

    如果是这种情况,还要检查您是否覆盖了映射。

    我有一个单元测试女巫导出映射。不幸的是,下面是旧版本:

    [Test, Ignore("Run this test only if you want to see mappings")]
        public void ShouldExportMappings()
        {
            const string mappingPath = @"mappings";
    
            if (!Directory.Exists(mappingPath))
                Directory.CreateDirectory(mappingPath);
    
            var sessionFactory = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.InMemory)
                .Mappings(m =>
                              {
                                  m.FluentMappings
                                      .AddFromAssemblyOf<User>()
                                      .ExportTo(mappingPath);
    
                                  m.AutoMappings
                                      .Add(new AutoPersistenceModelGenerator().Generate())
                                      .ExportTo(mappingPath);
                              }).BuildSessionFactory();
        } 
    

    最后,如果您真的想调试,请从存储中复制 FluentNHibernate 源并将其包含到您的 sln 中。但这不是一个好主意,因为问题出在您的代码而不是他们的代码中。这无济于事,您只会浪费时间。

    【讨论】:

    • 感谢您的回复 - 里面有很多有用的东西。然而,看起来问题的根源要简单得多——nHibernate 似乎在 Web 服务器上缓存了很多我不知道的东西——我假设它每次都重建了它的所有底层结构。停止/启动服务器实例解决了没有代码更改的问题。
    • 我们还有一个单元测试,它在运行单元测试之前在 CI 服务器上创建数据库,另一个用于部署,它使用虚拟数据创建一个用于手动测试的数据库。还有其他 unittest 女巫告诉我们数据库是否与映射匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多