我使用 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();