0

従来のデータベースを使用している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()を参照したりしてみましたが、何も役に立たないようです。

何か案は?

4

1 に答える 1

0

最終的にこの問題を解決しました。私はこれについてNHibernateの方法で考えていなかったことがわかりました。私の頭の中には新しいReportType.Numberがあったので、それを更新する必要がありました。実際には、新しいReportType.Numberを使用してReportTypeを取得し、Account.ReportTypeを設定する必要がありました。このようにすることで、期待どおりに機能しました。

于 2010-10-19T18:13:07.557 に答える