Свободная проблема сопоставления доменов NHibnerate - PullRequest
0 голосов
/ 10 сентября 2010

Мой домен:

public class Person
{
    public Person() { }
    public virtual int PersonId { get; set; }
    public virtual string Title { get; set; }
    public virtual string FirstName { get; set; }
    public virtual IList<Address> Addresses { get; set; }
}
public class Address
{
    public Address()
    {}
    public virtual int AddressId { get; set; }
    public virtual Person AddressPerson { get; set; }
    public virtual string BuildingNumber { get; set; }
    public virtual string AddressLine1 { get; set; }
}

Мое сопоставление:

public class AddressMap : ClassMap<Address>
{
    public AddressMap()
    {
        Table("Address");
        LazyLoad();
        Id(x => x.AddressId).GeneratedBy.Identity();
        References(x => x.AddressPerson).Column("PersonId").Not.Nullable();
        Map(x => x.BuildingNumber).Length(250).Not.Nullable();
        Map(x => x.AddressLine1).Length(100).Not.Nullable();
    }
}

public class PersonMap : ClassMap<Person>
{
   public PersonMap()
   {
    Table("Person");
    LazyLoad();
    Id(x => x.PersonId).Column("PersonId").GeneratedBy.Identity();
    Map(x => x.Title).Length(6).Nullable();
    Map(x => x.FirstName).Length(100).Not.Nullable();
    HasMany(x => x.Addresses).KeyColumn("PersonId");
    HasMany(x => x.Applications).KeyColumn("PersonId");
   }
}

Поэтому, когда я пытаюсь добавить адрес в список людей и сохранить, я получаю следующую ошибку:

объект ссылается на несохраненный переходный процесс instance - сохранить временный экземпляр до промывки. Тип: Rise.Core.Domain.Address, Entity: Rise.Core.Domain.Address

Я новичок в NHibernate, и меня немного смущает, что именно происходит. Я считаю, что мне нужно создать двунаправленный атрибут. Или я должен просто сохранять адрес самостоятельно после того, как я сохранил идентификатор лица session.SaveOrUpdate (Person), а затем session.SaveOrUpdate (Address)? Не уверен, что именно я делаю неправильно, мне нравится иметь список адресов на Person, который может быть лениво загружен, поскольку это действительно облегчает написание некоторого Linq.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2010

Нашел пост на stackoverflow об этом!Мне просто нужно добавить

.KeyColumn ("PersonId") .Inverse (). Cascade.SaveUpdate ();

0 голосов
/ 10 сентября 2010

Я полагаю, что возникла ошибка, поскольку вы пытались сохранить адрес перед сохранением лица, которому он принадлежит.

Я думаю, вам следует

1) Сохранить лицо P с пустым списком Адреса

2) Сохранить адрес A после добавления этого лица P в качестве AddressPerson of A

3) Добавить адрес A в Адреса лица P

...