5

私はNHibernateでこの関係をモデル化する必要があります(トピックにとどまるためにコードを少し単純化しました)-従業員はアカウントマネージャーになることができます(したがって、それはオプションです):

テーブルEmployee(Id、Number、Name)テーブルEmployeeIsAccountManager(Number、MaxAllowedDiscount)

テーブルEmployeeIsAccountManagerのId外部キーがテーブルEmployeeを指す代わりに、テーブルEmployeeIsAccountManagerのNumber列を指すNumber列がEmployeeテーブルにあります。

これをNHibernateでマッピングするにはどうすればよいですか?EmployeeIsAccountManagerクラスマッピングで外部ジェネレーターを使用しようとしましたが、外部生成値としてNumberを使用すると、NumberではなくIdであるEmployeeのIDにマップされます。構成を使用するようにクラスをモデル化しました。

public class Employee
{
   public virtual int Id { get; set; }
   public virtual short Number {get; set; }
   public virtual string Name {get; set; }
   public virtual AccountManager AccountManager { get; set; }
}

public class AccountManager
{
  public virtual short Number { get; set; } /*needed because of ID only?*/
  public virtual decimal MaxAllowedDiscount { get; set }
}   

私はたくさん(1対1、多対1、外国の発電機)を試しましたが、これがNHibernateで実行できるかどうかわかりません。ところで:クラスやマッピングなどを変更することはできますが、ブラウンフィールドステータス(2百万行以上のコード、約1000フォームの古いアプリケーション)のため、テーブル構造を変更できません。

どんな助けでもありがたいです、ありがとう!テッド

4

2 に答える 2

0
public class Employee
{
    public virtual short Number
    {
       get { return (AccountManager == null) ? 0 : AccountManager.Number; }
       set
       {
           if (AccountManager == null)
               AccountManager = new AccountManager();
           AccountManager.Number = value;
       }
    }
    public virtual AccountManager AccountManager { get; set; }
}

または GeneratedBy.Assinged() を使用

public class Employee
{
    public Employee()
    {
        AccountManager = new AccountManager();
    }

    public virtual AccountManager AccountManager
    {
        get;
        set { value.Parent = this; _accountManager = value; }
    }

    public class AccountManager
    {
        Internal protected virtual Employee Parent { get; set; } 

        protected virtual short Number { get { return Parent.Number; } set { } } /*needed because of ID only?*/
        public virtual decimal MaxAllowedDiscount { get; set }
    }
}
于 2011-11-25T16:04:38.753 に答える
0

あなたの質問により、クラスの継承について考えさせられます。クラス AccountManager を Employee のサブクラスとしてマップすると、やりたいことを実行できます。マッピングをテストしましたが、テーブルを設計したので、そうではありませんマッピングには次の 2 つの点に注意する必要があるため、ニーズを解決してください。

  1. Employee テーブルの number プロパティは、外部キーとして使用するために、AccountManager への一意の種類の外部キーである必要がありますが、NHibernate が新しい Account Manager を挿入しようとするとレコードを挿入するため、それでも機能しません。 person テーブルで、 person の id を AccountManager の number 列に割り当て、必要な休憩をとります。
  2. その関係を多対一としてマッピングすることは、同じ理由で機能しません。AccountManager の Number プロパティは主キーですか? ユニークです?NHibernate は主キーなしでは機能しないため、その関係を機能させるには、AccountManager の Number プロパティを Id 列として指定する必要があります。

私の頭に浮かぶ最後のオプションは、必要な値を取得するためにカスタム選択を指定できる数式で AccountManager テーブルにマップされた Employee クラスのプロパティを使用することです。私はプロパティ MaxAllowedDiscount を想定していますが、これにもいくつかの制限があります式を使用してプロパティをマップすると、このプロパティは挿入も更新もできません。

質問がある場合は、これが役立つことを願っています。

于 2011-02-28T14:13:40.167 に答える