Свободный nHibernate - сохраняет некоторые интерфейсы, а не другие - PullRequest
0 голосов
/ 25 марта 2011

Я столкнулся со странной ошибкой в ​​беглом nhibernate.У меня есть базовый набор классов, которые наследуются от интерфейсов, и я сопоставил интерфейсы с таблицами, и там, где классы используют их, они реализуют универсальный интерфейс.Они определены следующим образом:

interface IPage {
  // properties
}

class IPageMap : ClassMap<IPage> {
 // mapping information
}

class Page : IPage {
 // IPage Implementation
}

class ITag {
  // properties
}

class ITagMap : ClassMap<ITag> {
  // mapping information
}

class Tag : ITag {
  // ITag implementation
}

class Template {
  virtual IList<IPage> Pages { get; set; }
  virtual IList<ITag> Tags { get; set; }
}

Это должно работать нормально.Когда я создаю объект, подобный этому ...

var pages = new List<IPage> {
   new Page {
     // ..
   }
}

pages.ForEach( x => { session.SaveOrUpdate(x); } ); // no exception here

var tags = new List<ITag> {
   new Tag { 
     // ... 
   }
}

tags.ForEach( x => { session.SaveOrUpdate(x); } ); // exception happens here.

var list = new List<Template> {
  new Template {
     Pages = new List<IPage> {
       new Page { 
          // ... 
       }
     },
     Tags = new List<ITag> {
       new Tag { 
          // .. 
       }
     }
   }
}

Мне выдается следующее исключение.

Нет сохранения для Tag

Хорошо, я не определил персистер для Tag, но я сделал для ITag, и Tag наследует его.IPage и Page работают одинаково.Если я закомментирую информацию тега и просто оставлю реализацию IPage и Page, она отлично подойдет для них.

Почему к ITag и Tag относятся по-разному?Есть идеи?

1 Ответ

2 голосов
/ 25 марта 2011

Вам необходимо отобразить Tag как подкласс ITag. Каждый персистентный тип должен отображаться отдельно, вам нужно указать NH, куда собираются члены подкласса (даже если их нет) и, что более важно, конкретный тип NH должен быть создан при чтении данных из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...