C# NHibernate模式导出更改错误的表(NH中可能存在错误?)
我使用NHibernates模式导出功能来创建和更新数据库 然而,有时(似乎在速度较慢的机器上更频繁地发生)NHibernate会生成不正确的alter table脚本。我禁用了模式导出并记录语句以调试问题 此问题随机发生并随机影响不同的表 示例脚本是:C# NHibernate模式导出更改错误的表(NH中可能存在错误?),c#,sql,nhibernate,database-schema,mapping-by-code,C#,Sql,Nhibernate,Database Schema,Mapping By Code,我使用NHibernates模式导出功能来创建和更新数据库 然而,有时(似乎在速度较慢的机器上更频繁地发生)NHibernate会生成不正确的alter table脚本。我禁用了模式导出并记录语句以调试问题 此问题随机发生并随机影响不同的表 示例脚本是:alter table dbo.VlogNet\u NumberGroups add DKS\u P03\u Artikelgruppe BIGINT 但是,“DKS_P03_Artikelgruppe”列属于完全不同的映射,更糟糕的是,此映射甚
alter table dbo.VlogNet\u NumberGroups add DKS\u P03\u Artikelgruppe BIGINT
但是,“DKS_P03_Artikelgruppe”列属于完全不同的映射,更糟糕的是,此映射甚至配置为NHibernate.mapping.ByCode.SchemaAction.None
编辑:为了澄清我的问题:
为什么NHibernate会随机混合不同的映射并发出alter table命令来破坏我的数据库。
映射:
public class NumberGroupMap : HierachicalEntityMap<NumberGroup>
{
public NumberGroupMap()
{
Property(x => x.StartNumber);
Property(x => x.EndNumber);
Property(x => x.LastGeneratedNumber);
Property(x => x.StartTime);
Property(x => x.LifeSpan);
Property(x => x.ResetOnNewYear);
Property(x => x.IsResetable);
Property(x => x.WarningAtPos);
}
public override string TableName
{
get { return "VlogNet_NumberGroups"; }
}
}
设置NHibernate会话工厂的代码:
var modelMapper = new ModelMapper();
foreach (var assembly in _assembliesToScan)
{
Logger.DebugFormat(" * {0}", assembly);
modelMapper.AddMappings(assembly.GetTypes());
}
Logger.InfoFormat("Adding {0} class maps", _classMaps.Count);
foreach (var type in _classMaps)
{
Logger.DebugFormat(" * {0}", type);
modelMapper.AddMapping(type);
}
var cfg = new Configuration();
ConfigureNHibernate(cfg, Settings[Type]);
ConfigureEnvironment(cfg);
cfg.AddMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities());
ValidateSchema(cfg);
SessionFactory = cfg.BuildSessionFactory();
var modelMapper=新的modelMapper();
foreach(变量汇编在_assembliesToScan中)
{
DebugFormat(“*{0}”,程序集);
AddMappings(assembly.GetTypes());
}
InfoFormat(“添加{0}类映射”,_classMaps.Count);
foreach(类映射中的变量类型)
{
DebugFormat(“*{0}”,类型);
modelMapper.AddMapping(类型);
}
var cfg=新配置();
ConfigureNHibernate(cfg,设置[类型]);
配置环境(cfg);
AddMapping(modelMapper.compileMappingForAllExplicitlyAddedIdentities());
验证血球(cfg);
SessionFactory=cfg.BuildSessionFactory();
听起来可能与此有关 自那以后,NHibernate源代码(V3.3.4)有了更新,它应该已经修复了这个问题
有关更多详细信息,请参阅:我想了解为什么NHibernate会混淆不同的映射并发出alter table命令来破坏我的数据库。我看不到任何SQL alter命令?您能否显示实际执行schemaexport的位置以及映射添加到sessionfactory的位置?如果映射本身工作正常,并且schemaexport大部分时间都工作正常,我会怀疑NH会话工厂存在一些时间关键的访问问题,可能是由于多线程。schemaexport是在什么样的环境中执行的(安装项目、winforms应用程序、WCF服务、ASP.Net网站等)?我假设sessionfactory是线程安全的单例,这样就不会发生多个init(尽管它们是否会导致随机alter table语句也值得怀疑)。可以检查的一件事是_assembliesToScan集合中的程序集中是否有冗余映射。但这只是猜测,因为这些映射可能也会破坏正在运行的应用程序中的NH映射。我刚才注意到的唯一一个奇怪的细节是在映射(ClassMap)中可能混合了代码映射(ClassMapping)和FluentNHibernate。不知道会发生什么。这已经够奇怪的了,可以开始调试NH本身了。我建议您下载您当前使用的版本的NH源代码,并针对您的问题添加一些日志记录。实际的脚本生成发生在NHibernate.Cfg.Configuration.GenerateSchemaUpdateScript()中。在NHibernate.Tool.hbm2ddl.SchemaUpdate.Execute()中有一个元数据获取的示例。您可以构建一个只创建映射、从数据库获取元数据并创建脚本的小型测试应用程序。 var modelMapper = new ModelMapper(); foreach (var assembly in _assembliesToScan) { Logger.DebugFormat(" * {0}", assembly); modelMapper.AddMappings(assembly.GetTypes()); } Logger.InfoFormat("Adding {0} class maps", _classMaps.Count); foreach (var type in _classMaps) { Logger.DebugFormat(" * {0}", type); modelMapper.AddMapping(type); } var cfg = new Configuration(); ConfigureNHibernate(cfg, Settings[Type]); ConfigureEnvironment(cfg); cfg.AddMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities()); ValidateSchema(cfg); SessionFactory = cfg.BuildSessionFactory();