我使用 NHibernates 模式导出功能来创建和更新数据库。
然而有时(似乎更频繁地发生在慢速机器上)NHibernate 会生成不正确的更改表脚本。我禁用了模式导出并记录语句以调试问题。
此问题随机发生并影响随机不同的表。
一个示例脚本是:alter table dbo.VlogNet_NumberGroups add DKS_P03_Artikelgruppe BIGINT
然而,“DKS_P03_Artikelgruppe”列属于一个完全不同的映射,更糟糕的是,这个映射甚至被配置为NHibernate.Mapping.ByCode.SchemaAction.None
.
编辑:澄清我的问题: 为什么 NHibernate 会随机混合不同的映射并发出破坏我的数据库的更改表命令。
映射:
公共类 NumberGroupMap : HierachicalEntityMap<NumberGroup> { 公共 NumberGroupMap() { 属性(x => x.StartNumber); 属性(x => x.EndNumber); 属性(x => x.LastGeneratedNumber); 属性(x => x.StartTime); 属性(x => x.LifeSpan); 属性(x => x.ResetOnNewYear); 属性(x => x.IsResetable); 属性(x => x.WarningAtPos); } 公共覆盖字符串表名 { 得到{返回“VlogNet_NumberGroups”;} } }
HierachicalEntityMap<T>
派生自ClassMapping<T>
,它只是添加了一些属性(ID、名称、父级)并将 TableName 设置为相应属性的值。
该字段DKS_P03_Artikelgruppe
源自此映射:
公共类 DksCarrierInformationMap : ClassMapping<DksCarrierInformation> { 公共常量字符串 EntityTable = "DKS_Liste"; 公共 DksCarrierInformationMap() { 表(实体表); SchemaAction(NHibernate.Mapping.ByCode.SchemaAction.None); Id(x => x.Auto_ID, x => x.Generator(Generators.Identity)); 属性(x => x.Versanddaten_ID, x => { x.NotNullable(true); x.Unique(true); }); #region 发票地址 // ... 为简洁起见 #endregion #region 标签信息 // ... 为简洁起见 #endregion #region EDI // ... 为简洁起见 组件(x => x.DKS_P01,x => { x.Property(c => c.Artikelgruppe, c => c.Column("DKS_P01_Artikelgruppe")); x.Property(c => c.Anz_Teile, c => c.Column("DKS_P01_Anz_Teile")); x.Property(c => c.Anz_Buegel, c => c.Column("DKS_P01_Anz_Buegel")); x.Property(c => c.Gewicht, c => c.Column("DKS_P01_Gewicht")); x.Property(c => c.Type, c => { c.Column("DKS_P01_ArtikelTyp"); c.Type>(); c.Length(10); }); x.Property(c => c.Bezeichnung, c => c.Column("DKS_P01_Bezeichnung")); }); // ... 为简洁起见 组件(x => x.DKS_P03,x => { x.Property(c => c.Artikelgruppe, c => c.Column("DKS_P03_Artikelgruppe")); x.Property(c => c.Anz_Teile, c => c.Column("DKS_P03_Anz_Teile")); x.Property(c => c.Anz_Buegel, c => c.Column("DKS_P03_Anz_Buegel")); x.Property(c => c.Gewicht, c => c.Column("DKS_P03_Gewicht")); x.Property(c => c.Type, c => { c.Column("DKS_P03_ArtikelTyp"); c.Type>(); c.Length(10); }); x.Property(c => c.Bezeichnung, c => c.Column("DKS_P03_Bezeichnung")); }); // ... 为简洁起见 组件(x => x.DKS_P20,x => { x.Property(c => c.Artikelgruppe, c => c.Column("DKS_P20_Artikelgruppe")); x.Property(c => c.Anz_Teile, c => c.Column("DKS_P20_Anz_Teile")); x.Property(c => c.Anz_Buegel, c => c.Column("DKS_P20_Anz_Buegel")); x.Property(c => c.Gewicht, c => c.Column("DKS_P20_Gewicht")); x.Property(c => c.Type, c => { c.Column("DKS_P20_ArtikelTyp"); c.Type>(); c.Length(10); }); x.Property(c => c.Bezeichnung, c => c.Column("DKS_P20_Bezeichnung")); }); #endregion } }
设置 NHibernate SessionFactory 的代码:
var modelMapper = new ModelMapper(); foreach(_assembliesToScan 中的 var 程序集) { Logger.DebugFormat(" * {0}", 程序集); modelMapper.AddMappings(assembly.GetTypes()); } Logger.InfoFormat("添加 {0} 类映射", _classMaps.Count); foreach(_classMaps 中的 var 类型) { Logger.DebugFormat(" * {0}", type); modelMapper.AddMapping(type); } var cfg = 新配置(); 配置NHibernate(cfg,设置[类型]); 配置环境(cfg); cfg.AddMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities()); 验证架构(cfg); SessionFactory = cfg.BuildSessionFactory();