Утраченное наследство в NHibernate - PullRequest
1 голос
/ 16 августа 2011

Я сделал преобразование из 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 не разрешает должным образом наследование? Та же проблема касается таблицы для класса и таблицы для иерархии.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Это связано с тем, что NHibernate обеспечивает ленивую загрузку. Значение account.User в вашем неудачном тесте на самом деле является прокси-объектом. Это означает, что при загрузке учетной записи пользователь не извлекается из БД, пока вы не получите доступ к каким-либо его свойствам (если вы не указали это явно в своем запросе). Это означает, что когда NHibernate создает прокси-объект, он не знает, каков фактический тип этого объекта, и он создает прокси-объект, который наследуется непосредственно от класса User. В моем ответе я подробнее остановился на этом вопросе: Заставить ленивую сущность загрузить реальный экземпляр .

1 голос
/ 16 августа 2011

В NHibernate есть опция сопоставления "lazy = no-proxy" для свойства, которое должно решить проблему. Я не уверен, доступен ли он в Fluent NHibernate.

Прочитайте эту запись в блоге для более подробной информации

http://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations

...