私はレガシー データベースを使用しており、ある種のローカライズ テーブルを Fluent NHibernate にマップしようとしています。
テーブルは次のようになります。
DataName
[PK] TableName
[PK] FieldName
[PK] Id
[PK] LangId
Description
このテーブルは、次のエンティティを通じてマップされます。
public class DataName : EntityBase { パブリック仮想文字列 TableName { get; 設定; } パブリック仮想文字列 FieldName { get; 設定; } public virtual int Id { get; 設定; } public virtual Language 言語 { get; 設定; } public virtual string 説明 { get; 設定; } ... } public class DataNameMap : ClassMap { public DataNameMap() { Table("zDataName"); CompositeId().KeyProperty(x => x.TableName) .KeyProperty(x => x.フィールド名) .KeyProperty(x => x.Id) .KeyProperty(x => x.Language, "LangId").CustomType(); Map(x => x.Description).Column("Descr").Length(2000); } }
ローカリゼーションの目的で「DataName」エンティティに複数のエンティティがマップされており、マッピングは次のようになります。
パブリック クラス キャリア { public virtual int CarrId { get; 設定; } パブリック仮想文字列 CarrCode { get; 設定; } public virtual List DataNameList { get; 設定; } ... } パブリック クラス CarrierMap : ClassMap { public CarrierMap() { Table("キャリア"); Id(x => x.CarrId).GeneratedBy.Identity(); Map(x => x.CarrCode).Not.Nullable().Length(8); HasMany(x => x.DataNameList) .KeyColumn("ID") .Where("TableName = 'キャリア' AND FieldName = '名前'") .逆() .Cascade.AllDeleteOrphan(); ... } }
"DataName" テーブルには、次のようなレコードが含まれています。
TableName FieldName Id LangId 説明 --------- ---------- -- ------ ----------- キャリア名 1000 1 英語の説明 キャリア名 1000 2 フランス語の説明
データベースからこの情報を問題なく取得できますが、新しいエンティティ (挿入または更新) をデータベースに保存するとき、NHibernate は正しい順序で操作を実行しません。
INSERT INTO DataName (TableName, FieldName, LangId, Id, Description) VALUES ('Carriers', 'Name', 1, NULL, 'English description') INSERT INTO DataName (TableName, FieldName, LangId, Id, Description) VALUES ('Carriers', 'Name', 2, NULL, 'French description') キャリアに挿入....
この例では、データベースによって生成された ID が 2000 であるとします。
UPDATE DataName SET Id = 2000 WHERE TableName = 'Carriers' AND FieldName = 'Name' AND LangId = 1 AND Id IS NULL UPDATE DataName SET Id = 2000 WHERE TableName = 'Carriers' AND FieldName = 'Name' AND LangId = 2 AND Id IS NULL
DataNameList コレクションの HasMany マッピングの Inverse() オプションを試してみましたが、この特定の状況には何の影響もないようです。
「Carrier」エンティティが挿入された後に追加の UPDATE ステートメントを発行することなく、「Carrier」エンティティと「DataName」のコレクションを永続化するように NHibernate に指示するにはどうすればよいですか?