如何调试Fluent nHibernate

时间:2010-06-08 11:07:08

标签: nhibernate fluent

我在使用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 个答案:

答案 0 :(得分:1)

我认为您不需要调试FluentNhibernate。问题可能在于你的惯例。

据我所知,你有一个对象Region,它被引用到其他对象Workflow。 因此,为所有参考链接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");
    }
}

同时检查是否覆盖了映射,如果是这种情况。

我有一个unittest女巫导出映射。不幸的是贝娄是旧版本:

[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中。但这不是一个好主意,因为问题出在你的代码而不是他们的代码中。这没有用,你只会浪费时间。