2009-12-04 3 views
0

У меня есть два объекта, которые ссылаются друг на друга. С точки зрения чисто схемы, объект может иметь много экземпляров объекта два, которые ссылаются на него, но бизнес-логика указывает, что каждый экземпляр объекта 2 будет ссылаться на уникальный экземпляр объекта один и наоборот.nhibernate - циклическая ссылка не обновляется

Пример:

public class Object1 { 
    public Guid Id {get;set;} 
    public Object2 Object2 {get;set;} 

    public Object1ClassMap : ClassMap<Object1> 
    { 
     // ... 
     References<Object2>(x=>x.Object2) 
      .Column("Object2Id") 
      .Cascade.SaveUpdate() 
      .Not.LazyLoad(); 
    } 
} 

public class Object2 { 
    public Guid Id {get;set;} 
    public Object1 Object2 {get;set;} 

    public Object2ClassMap : ClassMap<Object1> 
    { 
     // ... 
     References<Object1>(x=>x.Object1) 
      .Column("Object1Id") 
      .Cascade.SaveUpdate() 
      .Not.LazyLoad(); 
    } 
} 

Когда я делаю следующее:

instanceOfObject1.Object2 = instanceOfObject2 

Я бы ожидать NHibernate для обнаружения обратной ссылки и автоматически делать

instanceOfObject2.Object1 = instanceOfObject1 

для меня, но это не происходит. Мне нужно вручную обновить в обоих направлениях. Любой способ избежать этого?

ответ

0

Вам нужно подумать об этом с точки зрения объектов POCO, а не отношений базы данных. Связь между obj1 и obj2 не предполагает обратной зависимости. Чтобы сделать сильную двунаправленную связь, вам нужно вручную установить отношения. Вы можете обнаружить, что проще написать пару функции множеств, что делает что-то вроде этого:

public class Object1(){ 
    public Object2 Object2 { get; internal set; } 

    public void SetObject2(Object2 obj2){ 
    Object2 = obj2; 
    obj2.Object1 = this; 
    } 
} 

public class Object2(){ 
    public Object1 Object1 { get; internal set; } 

    public void SetObject1(Object1 obj1){ 
    obj1.SetObject2(this); 
    } 
} 
0

Из того, что вы описали вам нужно отношение один-к-одному между вашими объектами. Я не могу объяснить это лучше, чем эта статья делает:

http://ayende.com/Blog/archive/2009/04/19/nhibernate-mapping-ltone-to-onegt.aspx

В статье используется XML-отображения, но я уверен, что вы сможете легко перевести его на Fluent пути.

Читайте, как он может дать вам ответ, который вы ищете.

В любом случае вы должны ожидать, что NHibernate обнаружит обратную ссылку после сохранения обоих объектов в сеансе NHibernate. (Как это происходит в примере статьи).

+0

Я пробовал один-к-одному, но, видимо, это работает только в том случае, если они совместно используют первичный ключ, которого нет. – Chris

Смежные вопросы