Свободный NHibernate: внешний ключ не нулевая проблема - PullRequest
0 голосов
/ 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").Cascade.All();
    }
}

Когда я запускаю следующий код:

Installation installation = TestHelper.CreateAnonymousInstallation();
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
session.Save(installation);

Я получаю следующую ошибку:

NHibernate.PropertyValueException: свойство not-null ссылается на ноль или переходное значение.

Как преодолеть проблему?

Заранее спасибо Лукаш Глаз

Ответы [ 2 ]

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

Я верю, что нужно обратное = правда.

HasMany<Institution>(i => i.Institutions)
   .KeyColumnNames.Add("InstallationId")
   .Cascade.All()
   .Inverse();

Или, конечно, добавить метод в классе установки для явной обработки.

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 virtual void AddInstitution(Institution entity)
    {
        entity.Installation = this;
        Institutions.Add(entity);
    }
}
0 голосов
/ 21 сентября 2009

Как я вижу, ваш класс Учреждения имеет ссылку на класс Установки. И эта ссылка не равна нулю. Когда вы создаете AnonymousInstitution, вы устанавливаете для него несколько инсталляций?

...