Вопрос по nhibernate, one-to-many, fluent-nhibernate, c# – Свободное владение nHibernate: проблема взаимоотношений один-ко-многим

3

У меня проблема с отношениями один-ко-многим. У меня есть следующие классы домена:

public class Installation : Entity
{        
    public virtual string Name { get; set; }
    public virtual IList Institutions { get; set; }

    public Installation()
    {
        Institutions = new List();
    }
}
public class Institution : Entity
{
    public virtual string Name { get; set; }
    public virtual string Address { get; set; }
    public virtual string City { get; set; }
    public virtual Installation Installation { get; set; }        
}

Я сделал базовый класс Entity в соответствии со следующимсообщение, У меня определены следующие сопоставления:

public class InstitutionMapping : ClassMap 
{
    public InstitutionMapping()
    {
        WithTable("Institution");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        Map(i => i.Address).Not.Nullable().WithLengthOf(50);
        Map(i => i.City).Not.Nullable().WithLengthOf(50);
        References(i => i.Installation).ColumnName("InstallationId").Not.Nullable().WithForeignKey();
    }
}

public class InstallationMapping : ClassMap
{
    public InstallationMapping()
    {
        WithTable("Installation");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        HasMany(i => i.Institutions).KeyColumnNames.Add("InstallationId").Inverse().Cascade.All();
    }
}

Я тестирую модуль, добавляя учреждения к установке следующим образом:

Installation installation = TestHelper.CreateAnonymousInstallation();
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
session.Save(installation);    
session.Flush();
session.Clear();
Installation returnedInstallation = session.Get(installation.Id);
Assert.AreEqual(2, returnedInstallation.Institutions.Count);

Я получаю исключение утверждения, потому что возвращаемое число учреждений равно 0. Я проверил в SQL Profiler, и учреждения сохраняются в базе данных, но их InstallationId равен нулю. Может кто-нибудь сказать мне, что я делаю не так?

stackoverflow.com/questions/713637/... Mauricio Scheffer

Ваш Ответ

2   ответа
1

в частности,

Installation installation = TestHelper.CreateAnonymousInstallation();
Institution institution = TestHelper.CreateAnonymousInstitution();
institution.Installation = installation;
installation.Institutions.Add(institution);
Помните, что nh не выполняет автоматическую синхронизацию двунаправленных отношений. epitka
Я знаю, что ваше решение работает. Однако я подумал, что в случае нормальных двунаправленных отношений NHibernate должен делать это автоматически. Есть ли способ настроить решение так, чтобы было необходимо только добавить дочерние элементы в коллекцию без установки родительской ссылки? GUZ
Да. Дон»установитьinverse="true", Но тогда, если вы установите ребенкаСсылка на своего родителя напрямую вместо добавления дочернего элемента к родителюS коллекция, NHibernate не может изменить отношения. yfeldblum
5

inverse="false"тогда родительский объект владеет отношениями и любые изменения родительского объектаКоллекция будет отражена в базе данных.

inverse="true"тогда дочерний объект владеет отношениями и любыми изменениями в дочернем объекте.Ссылка на родителя будет отражена в базе данных.

Потому что вы установилиinverse="true", вам нужно будет изменить дочерний объектs ссылка на родительский объект для того, чтобы NHibernate смог его обработать. Если вы хотите, чтобы NHibernate отслеживал изменения в отношениях каждый раз, когда вы добавляете детей или удаляете их от родителей »Коллекция, которую вы должны установитьinverse="false" на коллекции.

Ответ: вы всегда должны изменить обе стороны отношений. Установите ребенкаs родительская ссылка и добавление дочернего элемента к родительскомус коллекцией, каждый раз. Делаете ли вы это в два этапа каждый раз, или вы создаете какой-то прозрачный способ сделать это за один шаг, решать только вам. yfeldblum
Действительно, это решает мою проблему, когда нет Not.Nullable () и когда PatronId может быть нулевым. Если это не тот случай, когда я сохраняю установку в моем модульном тесте, я получаю следующую ошибку: " NHibernate.PropertyValueException: свойство not-null ссылается на нулевое или временное значение ", Как преодолеть эту проблему? GUZ
Вы можете либо карту ребенка "Родительская ссылка какcascade="all" (в дополнение к отображению родителя 'Собрание детей какcascade="all") или убедитесь, что вы всегда звонитеISession.Save на родителя перед сессией сбрасывается. yfeldblum
Я понимаю. У меня есть еще одна проблема: я тестирую отображение с использованием PersistenceSpecification. При проверке отображения ofr метод Institution CheckList также выдает NHibernate.PropertyValueException: "свойство not-null ссылается на нулевое или временное значение ", Как использовать PersistenceSpecification, когда мне нужно изменить обе стороны отношений? GUZ

Похожие вопросы