1

私のアプリケーションには次のタイプが定義されています

public interface IUser {
   int Id { get; set; }
   int UserName { get; set; }
}

public class User : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
}

User クラスは次のように流暢にマッピングされます。

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
    }
}

IUser の別の実装を作成したいのですが、いくつかの制限があります。

  1. 新しいフィールドは、Users テーブルと同じテーブルに追加する必要があります
  2. 型を拡張するコードは別のプロジェクトに存在します

たとえば、ここに私の新しいクラスがあります:

public class CustomUser : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
   public virtual string Name { get; set; }
}

次のようにマッピングされます。

public class CustomUserMap : ClassMap<CustomUser> {
    public CustomUserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
        Map(x => x.Name);
    }
}

これに関して私が最初に抱えた問題は、同じインターフェースが 2 回マップされるのを好まないということでした。Application_Start イベントにコードを追加して、CustomUserMap クラスが存在しない場合にのみ UserMap クラスを追加することで、これを克服しました。

ただし、すぐに次の問題に遭遇しました。別のタイプの IUser インターフェイスへの参照を追加すると、エラーがスローされます。

テーブル Blogs からの関連付けは、マップされていないクラス IUser を参照します。

私はおそらく完全に間違っていると思います。誰かが私が間違っていることを教えてくれれば幸いです。ありがとう

4

1 に答える 1

0

それらを同じテーブルにマップしたい場合は、ユーザーを継承してみませんか? これにより、IUser インターフェイスも実装されます。

選択の重複を防ぐために (User をフェッチするときに、2 回目のラウンドトリップで CustomerUser をフェッチする可能性があります)、User クラスで明示的にポリモーフィズムを指定する必要があります。hbm ファイルでは、これは polymorphism="explicit" になります。流暢な nhibernate についてはわかりません。

于 2012-01-13T15:28:27.610 に答える