2010-06-08 61 views
0

我在使用Fluent nHibernate时遇到了一些麻烦。我在表格中添加了一列,我想我已经正确地更改了映射和连接的数据对象,以正确反映这一点。然而,当我试图运行我的应用程序再次我一直得到这个错误:如何调试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执行。

任何有关从哪里出发的想法?

回答

1

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

据我所知,你有一个对象区域,它被引用到其他对象的工作流程。 因此,成立一个约定所有参考链接EQ:

 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。但这不是个好主意,因为问题出在你的代码而不是他们的代码中。这不会有帮助,你只会失去时间。

+0

感谢您的回复 - 这里有很多有用的东西。 然而,它看起来好像问题的根源要简单得多 - 看起来nHibernate在Web服务器上缓存了很多东西,我不知道 - 我假设它每次都重建了它的所有底层结构。停止/启动服务器实例解决了无代码更改的问题。 – 2010-06-08 11:55:09

+0

我们还有一个单元测试,它在运行unite之前创建CI服务器上的数据库,另一个用于创建数据库的虚拟数据库用于手动测试。 也有其他unittest女巫告诉我们,如果数据库匹配的映射 – isuruceanu 2010-06-08 12:05:18