従来のデータベースを使用しているWebアプリケーションのテスト容易性と保守性を改善するためにFluentNHibernateを使用していますが、この構造を適切にマッピングするのに問題があります。
ドメイン内の1つのエンティティを実際に表す2つのテーブルがあるため、結合を使用してそれらをマップし、3番目のテーブルは2番目のエンティティを表します。
DBテーブル:
[eACCT]
ACCT_ID
ACCT_NAME
[eREPORT_TYPE]
ACCT_ID
REPORT_NO
[eREPORT_TYPE_DESC]
REPORT_NO
REPORT_TYPE
エンティティ:
public class Account
{
public virtual string AccountID { get; set; }
public virtual string AccountName { get; set; }
public virtual ReportType ReportType { get; set; }
}
public class ReportType
{
public virtual int Number { get; set; }
public virtual string Type { get; set; }
}
マッピング:
public AccountMap()
{
Table("eACCT");
Id(x => x.AccountID, "ACCT_ID");
Map(x => x.AccountName, "ACCT_NAME");
Join("eREPORT_TYPE", m =>
{
m.KeyColumn("ACCT_ID");
m.References(x => x.ReportType)
.Cascade.None()
.Column("REPORT_NO");
});
}
public ReportTypeMap()
{
Table("eREPORT_TYPE_DESC");
Id(x => x.Number)
.Column("REPORT_NO")
.GeneratedBy.Assigned();
Map(x => x.Type, "REPORT_TYPE");
}
これはGetsで正常に機能しますが、Account.ReportType.Numberを変更してからSaveOrUpdate()Accountを変更すると、次のエラーが発生します。'DataTest.Model.ReportTypeのインスタンスの識別子が(old_value)から(new_value)に変更されました。 。
AccountのReportTypeへの参照を変更するだけで、ReportTypeへの参照にCascade.None()プロパティを設定することで、NHibernateはReportTypeインスタンスも保存しようとしないと思いましたが、それがどのように行われるかを誤解している必要があります。動作します。ReportType ReadOnly()を作成したり、ReportType ReadOnly()を参照したりしてみましたが、何も役に立たないようです。
何か案は?