如何调试Fluent nHibernate
我和纳特之间有点问题。我在表中添加了一列,我认为我已经正确地更改了映射和连接的数据对象,以正确地反映这一点。但是,当我再次尝试运行我的应用程序时,我不断出现以下错误:如何调试Fluent nHibernate,nhibernate,fluent,Nhibernate,Fluent,我和纳特之间有点问题。我在表中添加了一列,我认为我已经正确地更改了映射和连接的数据对象,以正确地反映这一点。但是,当我再次尝试运行我的应用程序时,我不断出现以下错误: System.Data.SqlClient.SqlException: Invalid column name 'Workflow_id'. 我真的看不出我所做的更改有什么问题,所以我从源代码管理中恢复到映射和数据对象文件的原始版本,并从数据库中删除了有问题的列。但我还是犯了同样的错误 我想要一些关于如何调试这个的建议。报告错误
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执行
关于从这里走到哪里有什么想法吗?我认为您不需要调试FluentNhibernate。问题可能在你的公约中 据我所知,您有一个对象区域,它被引用到其他对象工作流。 因此,为所有参考链接e.q.设置约定:
private Action<IConventionFinder> GetConventions()
{
return c =>
{
c.Add<PrimaryKeyConvention>();
c.Add<ReferenceConvention>();
c.Add<HasManyConvention>();
c.Add<TableNameConvention>();
c.Add<PropertyNameConvention>();
};
}
参考公约应该是这样的:
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();
}
[测试,忽略(“仅当您想查看映射时才运行此测试”)]
public void应导出映射()
{
常量字符串映射路径=@“映射”;
如果(!Directory.Exists(mappingPath))
CreateDirectory(映射路径);
var sessionFactory=fluntly.Configure()
.Database(SQLiteConfiguration.Standard.InMemory)
.Mappings(m=>
{
m、 FluentMappings
.AddFromAssemblyOf()的
.ExportTo(映射路径);
m、 汽车用品
.Add(新的AutoPersistenceModelGenerator().Generate())
.ExportTo(映射路径);
}).BuildSessionFactory();
}
最后,如果您真的想调试,请从其存储中复制FluentNHibernate源并将其包含到您的sln中。但这不是一个好主意,因为问题出在您的代码中,而不是他们的代码中。这不会有帮助,你只会浪费时间。谢谢你的回复,里面有很多有用的东西。然而,看起来问题的根源要简单得多——nHibernate似乎在web服务器上缓存了很多东西,我不知道——我假设它每次都重建了所有的底层结构。停止/启动服务器实例修复了此问题,没有代码更改。我们还有一个unittest,它在运行unittest之前在CI server上创建数据库,另一个用于deploy,它使用虚拟数据创建数据库以进行手动测试。还有其他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();
}