2011-08-16 8 views
1

私はEF4からnHibernateへの変換を行いましたが、今や継承にほとんど問題はありません。NHibernateで失われた継承

私のエンティティとマッピング:

public class User 
{ 
public virtual int Id { get; set; } 
public virtual string UserName { get; set; } 
} 
public class Account 
{ 
    public virtual int Id { get; set; } 
    public virtual User User { get; set; } 
} 
public class Member : User 
{ 
    public virtual string SpecialPropForMember { get; set; } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.UserName); 
    } 
} 
public class AccountMap : ClassMap<Account> 
{ 
    public AccountMap() 
    { 
     Id(x => x.Id); 
     References(x => x.User); 
    } 
} 
public class MemberMap : SubclassMap<Member> 
{ 
    public MemberMap() 
    { 
     Map(x => x.SpecialPropForMember); 
    } 
} 

マイ渡さテスト:

[Test] 
    public void TestMemberUserInheritence() 
    { 
     User newUser = new User() 
     { 
      UserName = RandomValues.String() 
     }; 

     Member newMember = new Member() 
     { 
      SpecialPropForMember = "special" 
     }; 


     Account newAccount = new Account() 
     { 
      User = newMember 
     }; 

     Member member = account.User as Member; 
     Assert.IsNotNull(member); 
    } 

とは、テストに失敗しました:

[Test] 
    public void TestMemberUserInheritenceFromNHibernate() 
    { 
     User newUser = new User() 
     { 
      UserName = RandomValues.String() 
     }; 
     UsersService().AddUser(newUser); 

     Member newMember = new Member() 
     { 
      SpecialPropForMember = "special" 
     }; 
     MemberService().Add(newMember); 

     Account newAccount = new Account() 
     { 
      User = newMember 
     }; 
     AccountService().Add(newAccount); 

     Account account; ; 
     using (var session = DataAccess.OpenSession()) 
     { 
      account = session.Linq<Account>().First(); 
     } 

     Member member = account.User as Member; 
     Assert.IsNotNull(member); 
    } 

NHが正しく継承を解決しない理由を誰かが私に説明してもらえ? 同じ問題は、クラスごとのテーブルと階層ごとのテーブルについてです。

+0

のためにこのブログの記事を読むあなたはこれが正しく保存されてよろしいですか? –

答えて

2

NHibernateが遅延ロードを提供する方法のためです。アカウントの価値。失敗したテストのユーザーは、実際にはプロキシオブジェクトです。これは、アカウントを読み込んでいるときに、ユーザーがそのプロパティのいずれかにアクセスするまで(クエリに明示的に指定していない限り)、DBからユーザーをフェッチしないことを意味します。これは、NHibernateがプロキシオブジェクトを作成するときに、このオブジェクトの実際の型がわからず、Userクラスから直接派生するプロキシオブジェクトを作成することを意味します。私はこの質問への私のanwserで詳細:Force lazy entity to load real instanceに行ってきました。

関連する問題