1

Table-per-subclass マッピングを使用して、次のドメイン オブジェクトをマッピングしています。

class User {
    Id;
    FirstName;
    LastName;
    etc.
}

class Manager : User {
    // manager specific properties
}

UI で新しいUserが作成されると、役割が選択されているかどうかを確認し、必要に応じてではなくManagerのインスタンスを作成 (および保存) します。ManagerUser

User目標は、から への変換プロセスをManagerできるだけ単純にすることです (役割を選択するだけです)。

NHibernate を削除してaManagerを aにダウングレードしようとすると、レコードも削除しようとしているため (Roles テーブルに制約があります)、例外がスローされます。UserManagerUser

同様に、ユーザーを に「アップグレード」する方法がわかりませんManager。アップキャストできないのでManager、既存のものと同じ ID で新しいインスタンスを作成する必要があると思いUserますか?

のサブクラス マッピングをManager以下に示します。

public class ManagerMap : SubclassMap<Manager>
{
    public ManagerMap()
    {
        Table("Managers");
        KeyColumn("UserId");
        Map(n => n.EmploymentType);
        Map(n => n.PriorityLevel);
    }
}
4

2 に答える 2

2

申し訳ありませんが、これは不可能です。私は数年前に似たようなことをしようとしましたが、NHibernate のヘビーユーザーである何人かの人々に、知っているかどうかを尋ねました。結論は、それは不可能でした。

私または私が知っている人が思いつくことができる唯一の解決策は、ダイレクト SQL を使用してデータベース内のディスクリミネーターを手動で更新することでした。

User は 1 つのタイプのみであると仮定します。

つまり、マネージャー、従業員、または研修生です。

ユーザーの種類を変更できるドロップダウンを使用して、ユーザーのリストを表示します。そのため、ユーザーの「編集」とは別のプロセスでした。

これにより、ユーザーのアップグレードとダウングレードの両方が可能になりました。ユーザーを管理するための2段階のプロセスにするという欠点があります。

于 2013-07-16T09:30:14.460 に答える
1

ここで継承を使用してユーザーをマネージャーにするのは悪い考えだと思います。ユーザーが複数の役割を果たしている場合は、注意が必要です。null 許容の ManagerBehaviour プロパティを User クラスに追加し、最終的には、ユーザーに Behavior オブジェクトのバッグを持たせることにします。

于 2013-07-16T09:51:59.603 に答える