私のアプリケーションは、次の種類があり、Userクラスが流暢のようにマッピングされている NHibernateは - 同じインタフェースを実装する複数の種類
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; }
}
定義:
public class UserMap : ClassMap<User> {
public UserMap() {
Table("Users");
Id(x => x.Id);
Map(x => x.UserName);
}
}
私はたIUserの別の実装を作成したいのですが私はいくつかの制限があります:
- 新しいフィールドは、Usersテーブルと同じテーブルに追加する必要があります
- タイプを拡張するためのコードは、例えば、別々のプロジェクト
に存在し、ここで私の新しいクラスである:
のようにマッピングされている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回写像されるのが好きではなかった。 CustomUserMapクラスが存在しない場合にのみUserMapクラスを追加するように、Application_Startイベントにコードを追加することでこれを克服しました。
私はすぐに私の次の問題に遭遇したが、私は別のタイプでたIUserインターフェースへの参照を追加した場合、それはエラーがスローされます。
An association from the table Blogs refers to an unmapped class: IUser
私はおそらく完全に間違っている事についてつもりだと私は」私が間違っていることを誰かが見せてくれたら、それを感謝します。ありがとう
私は最初にそれをしなかったのは、ポリモルフィズム= "明示的"(Fluent NHibernateのPolymorphism.Explicit();)について考えていなかったからです。しかしこれで私はユーザーからカスタムユーザーにキャストできません。 var customUser =(CustomUser)session.Get(1)はエラーをスローします。これを受け入れる必要があるかもしれませんが、可能であれば教えてください。 Thanks –
nfplee
CustomerUserに必要な追加フィールドを取得していないため、CustomerUserにキャストすることができません。 CustomerUserをフェッチすることでそれを取り除き、代わりにUserにキャストすることができます。その場合、NhibernateでUserクラスをバインドする必要はありません。それ以外の場合は、CustomerUserが必要なときにいつでも(user.Id)を取得するだけで済みます。 –
jishi
ありがとう、私がUserをCustomUserにキャストしたい理由は、Userを返すサービスメソッドがあるからです。しかし、私はTを返すようにサービスメソッドを変更することができると思う。T:IUser。 – nfplee