0

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();

4

1 に答える 1

1

これに関係しているように聞こえますか?

NHibernate - クエリの間違った列

その後、NHibernate ソース コード (v 3.3.4) が更新され、問題が修正されたはずです。

詳細については、https: //groups.google.com/forum/#!topic /nhusers/BZoBoyWQEvs を参照してください。

于 2014-08-18T09:47:06.190 に答える