1

EF4から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が継承を適切に解決しない理由を誰かが説明してもらえますか?同じ問題は、クラスごとのテーブルと階層ごとのテーブルにも当てはまります。

4

2 に答える 2

2

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

于 2011-08-16T12:51:10.830 に答える