1

私のアプリケーションは、次の種類があり、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の別の実装を作成したいのですが私はいくつかの制限があります:

  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回写像されるのが好きではなかった。 CustomUserMapクラスが存在しない場合にのみUserMapクラスを追加するように、Application_Startイベントにコードを追加することでこれを克服しました。

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

An association from the table Blogs refers to an unmapped class: IUser

私はおそらく完全に間違っている事についてつもりだと私は」私が間違っていることを誰かが見せてくれたら、それを感謝します。ありがとう

答えて

0

同じテーブルにマップする場合は、Userを継承してみませんか?これはIUserインターフェイスも実装します。

重複した選択を防ぐために(ユーザーをフェッチするとき、2回目の往復でCustomerUserをフェッチする場合があります)、Userクラスで多型を明示的に指定する必要があります。 hbmファイルでは、これはpolymorphism = "explicit"であり、流暢なnhibernateについてはわかりません。

+0

私は最初にそれをしなかったのは、ポリモルフィズム= "明示的"(Fluent NHibernateのPolymorphism.Explicit();)について考えていなかったからです。しかしこれで私はユーザーからカスタムユーザーにキャストできません。 var customUser =(CustomUser)session.Get (1)はエラーをスローします。これを受け入れる必要があるかもしれませんが、可能であれば教えてください。 Thanks – nfplee

+0

CustomerUserに必要な追加フィールドを取得していないため、CustomerUserにキャストすることができません。 CustomerUserをフェッチすることでそれを取り除き、代わりにUserにキャストすることができます。その場合、NhibernateでUserクラスをバインドする必要はありません。それ以外の場合は、CustomerUserが必要なときにいつでも(user.Id)を取得するだけで済みます。 – jishi

+0

ありがとう、私がUserをCustomUserにキャストしたい理由は、Userを返すサービスメソッドがあるからです。しかし、私はTを返すようにサービスメソッドを変更することができると思う。T:IUser。 – nfplee

関連する問題