Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate模式导出更改错误的表(NH中可能存在错误?)_C#_Sql_Nhibernate_Database Schema_Mapping By Code - Fatal编程技术网

C# NHibernate模式导出更改错误的表(NH中可能存在错误?)

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”列属于完全不同的映射,更糟糕的是,此映射甚

我使用NHibernates模式导出功能来创建和更新数据库

然而,有时(似乎在速度较慢的机器上更频繁地发生)NHibernate会生成不正确的alter table脚本。我禁用了模式导出并记录语句以调试问题

此问题随机发生并随机影响不同的表

示例脚本是:
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();