Свободное владение nHibernate: проблема отношений один-ко-многим - PullRequest
3 голосов
/ 21 сентября 2009

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

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

    public Installation()
    {
        Institutions = new List<Institution>();
    }
}
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 в соответствии со следующим post . У меня определены следующие сопоставления:

public class InstitutionMapping : ClassMap<Institution> 
{
    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<Installation>
{
    public InstallationMapping()
    {
        WithTable("Installation");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        HasMany<Institution>(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>(installation.Id);
Assert.AreEqual(2, returnedInstallation.Institutions.Count);

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

Ответы [ 2 ]

5 голосов
/ 21 сентября 2009

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

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

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

1 голос
/ 21 сентября 2009

Вы должны вручную установить свойство установки учреждения, в частности,

Installation installation = TestHelper.CreateAnonymousInstallation();
Institution institution = TestHelper.CreateAnonymousInstitution();
institution.Installation = installation;
installation.Institutions.Add(institution);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...