2012-03-28 2 views
0

Я пытаюсь смоделировать родительскую/дочернюю ассоциацию, в которой родительский класс (Person) владеет многими экземплярами дочернего класса (OwnedThing) - я хочу, чтобы экземпляры OwnedThing сохранялись автоматически, когда класс Person сохранен, и я хочу, чтобы ассоциация была двунаправленной.Двунаправленная ассоциация NHibernate

public class Person 
{ 
     public class MAP_Person : ClassMap<Person> 
     { 
       public MAP_Person() 
       { 
         this.Table("People"); 
         this.Id(x => x.ID).GeneratedBy.GuidComb().Access.BackingField(); 
         this.Map(x => x.FirstName); 
         this.HasMany(x => x.OwnedThings).Cascade.AllDeleteOrphan().KeyColumn("OwnerID").Inverse(); 
       } 
     } 

     public virtual Guid ID { get; private set; } 
     public virtual string FirstName { get; set; } 
     public virtual IList<OwnedThing> OwnedThings { get; set; } 

     public Person() 
     { 
       OwnedThings = new List<OwnedThing>(); 
     } 
} 



public class OwnedThing 
{ 
     public class MAP_OwnedThing : ClassMap<OwnedThing> 
     { 
       public MAP_OwnedThing() 
       { 
         this.Table("OwnedThings"); 
         this.Id(x => x.ID).GeneratedBy.GuidComb().Access.BackingField(); 
         this.Map(x => x.Name); 
         this.References(x => x.Owner).Column("OwnerID").Access.BackingField(); 
       } 
     } 

     public virtual Guid ID { get; private set; } 
     public virtual Person Owner { get; private set; } 
     public virtual string Name { get; set; } 
} 

Если установить Person.OwnedThings инверсного то OwnedThing экземпляров не сохраняется при сохранении человека. Если я не добавлю Inverse, то сохранение будет успешным, но person.OwnedThings [0] .Owner всегда имеет значение null после того, как я извлечу его из базы данных.

UPDATE При сохранении данных NHibernate установит единый конец ассоциации в базе данных, поскольку она устанавливается через много-конце ассоциации, поэтому, когда я извлечь OwnedThing из БД делает есть перейдите к набору Person. Моя нулевая ссылка была от Envers, которая, похоже, не делает то же самое.

ответ

0

Am Я правильно вас понять, что ваша проблема происходит только на «истории» сущностей прочитанных NHibernate Envers?

Если да, то это может быть вызвано этой ошибкой https://nhibernate.jira.com/browse/NHE-64 Обходной сейчас является использование Merge вместо (Сохранитьили) Update.

0

OwnedThings[0].Owner, скорее всего, null, потому что вы не устанавливаете его, когда добавляете. При использовании двунаправленной связи, которые вы должны сделать что-то вроде ниже:

Person person = new Person(); 
OwnedThing pwnedThing = new OwnedThing(); 

pwnedThing.Owner = person; 
person.OwnedThings.Add(pwnedThing); 

Если вы не в явной форме установить pwnedThing.Owner и вы запрашиваете тот же объект в том же ISession, что вы создали его на нем будет нулевым. Обычно я добавляю или удаляю методы, которые делают эту «дополнительную» работу для меня. Возьмем следующий пример:

public class Order : Entity 
{ 
    private IList<OrderLine> orderLines; 
    public virtual IEnumerable<OrderLine> OrderLines { get { return orderLines.Select(x => x); } } 

    public virtual void AddLine(OrderLine orderLine) 
    { 
     orderLine.Order = this; 
     this.orderLines.Add(orderLine); 
    } 

    public virtual void RemoveLine(OrderLine orderLine) 
    { 
     this.orderLines.Remove(orderLine); 
    } 
} 

public class OrderMap : ClassMap<Order> 
{ 
    public OrderMap() 
    { 
     DynamicUpdate(); 
     Table("ORDER_HEADER"); 
     Id(x => x.Id, "ORDER_ID"); 

     HasMany(x => x.OrderLines) 
      .Access.CamelCaseField() 
      .KeyColumn("ORDER_ID") 
      .Inverse() 
      .Cascade.AllDeleteOrphan(); 
    } 
} 
Смежные вопросы