Nhibernate: отображение двух разных свойств между теми же двумя объектами - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть класс A:

public class ClassA
{
      public int ID {get; private set;}
      public string Code {get; private set;}
      public ClassB B {get; private set;}
      public IList<ClassB> ListB {get; private set;}

}

И Класс B:

public class ClassB
{
      public int ID {get; private set;}
      public string Code {get; private set;}
      public ClassA A {get; private set;}
      //some other attributes...
}

И сопоставления:

public ClassAMap()
{
    Table("ClassA");

    Id(classA => classA .ID, "ID").GeneratedBy.Identity();
    Map(classA  => classA.Code, "Code").Unique().Not.Nullable();
   //HERE IS THE PROBLEM: --------
    References(classA  => classA.B,"IDClassB").Cascade.SaveUpdate(); 
   //-----
    HasMany(classA  => classA.ListB).Table("ClassB").KeyColumn("IDClassA").AsBag().Not.LazyLoad().Inverse().Cascade.AllDeleteOrphan();
}

Отображения ClassB:

public ClassBMap()
{
    Table("ClassB");
    Id(classB => classB.ID).GeneratedBy.Identity();
    References(classB => classB.A, "IDClassA").ForeignKey("ID").Cascade.SaveUpdate();

}

Отображения для ListB в классе A работали нормально, потому что сначала было только свойство ListB, а не B, когда мне нужно было отобразить B, я попробовал это:

References(classA  => classA.B,"IDClassB"); 

Тест сопоставления не пройден, поскольку B не был сохранен, поэтому я сделал это:

References(classA  => classA.B,"IDClassB").Cascade.SaveUpdate(); 

На этот раз B был сохранен, но при сохранении B класс A был вставлен два раза, A.B и B.A.

Как я могу решить эту проблему? Почему это работает для свойства ListB, а не для свойства B? Спасибо

1 Ответ

0 голосов
/ 22 декабря 2009

Я решил эту проблему, создав в классе A список, содержащий элементы B и listB, теперь свойства B и listB являются «представлениями» этого нового списка. Чтобы отличить прежние элементы listB от прежних свойств B в этом новом списке, я добавил логическое значение в classB, если true - это B, false - это элемент listB.

...