NHibernates スキーマ エクスポート機能を使用して、データベースを作成および更新します。
ただし、ときどき (低速のマシンでより頻繁に発生するようです) NHibernate は誤ったテーブル変更スクリプトを生成します。スキーマのエクスポートを無効にし、ステートメントをログに記録して問題をデバッグしました。
この問題はランダムに発生し、ランダムに異なるテーブルに影響します。
スクリプトの例は次のとおりです。alter table dbo.VlogNet_NumberGroups add DKS_P03_Artikelgruppe BIGINT
ただし、「DKS_P03_Artikelgruppe」列は完全に異なるマッピングに属しており、さらに悪いことに、このマッピングは に構成されていますNHibernate.Mapping.ByCode.SchemaAction.None
。
編集: 私の質問を明確にするために: NHibernate が異なるマッピングをランダムに混同し、データベースを破壊するテーブル コマンドを変更するのはなぜですか。
マッピング:
public class NumberGroupMap : HierachicalEntityMap<NumberGroup> { public NumberGroupMap() { プロパティ (x => x.StartNumber); プロパティ (x => x.EndNumber); Property(x => x.LastGeneratedNumber); プロパティ (x => x.StartTime); プロパティ (x => x.LifeSpan); プロパティ (x => x.ResetOnNewYear); プロパティ (x => x.IsResetable); Property(x => x.WarningAtPos); } パブリック オーバーライド文字列 TableName { get { return "VlogNet_NumberGroups"; } } }
HierachicalEntityMap<T>
から派生しClassMapping<T>
、いくつかのプロパティ (ID、名前、親) を追加し、TableName を対応するプロパティの値に設定するだけです。
フィールドは、次のDKS_P03_Artikelgruppe
マッピングに由来します。
public class DksCarrierInformationMap : ClassMapping<DksCarrierInformation> { public const string EntityTable = "DKS_Liste"; public DksCarrierInformationMap() { テーブル(エンティティテーブル); SchemaAction(NHibernate.Mapping.ByCode.SchemaAction.None); Id(x => x.Auto_ID, x => x.Generator(Generators.Identity)); Property(x => x.Versanddaten_ID, x => { x.NotNullable(true); x.Unique(true); }); #region 請求先住所 // ... 簡潔にするために残しました #endregion #region レーベル情報 // ... 簡潔にするために残しました #endregion #地域EDI // ... 簡潔にするために残しました Component(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")); }); // ... 簡潔にするために残しました Component(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 = 新しい ModelMapper(); foreach (_assembliesToScan の var アセンブリ) { Logger.DebugFormat(" * {0}", assembly); modelMapper.AddMappings(assembly.GetTypes()); } Logger.InfoFormat("{0} クラス マップを追加しています", _classMaps.Count); foreach (_classMaps の var 型) { Logger.DebugFormat(" * {0}", タイプ); modelMapper.AddMapping(タイプ); } var cfg = 新しい構成(); ConfigureNHibernate(cfg, 設定[タイプ]); 構成環境 (cfg); cfg.AddMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities()); ValidateSchema(cfg); SessionFactory = cfg.BuildSessionFactory();