0

Вот мои соответствующие классы:Необычная коллекция NHibernate/отображение наследования

public class ArticleMetadata 
{ 
    public long ID { get; set; } 

    public string Slug { get; set; } 
} 

public class Article : ArticleMetadata 
{ 
    // This is a massive CLOB, hence separate class 
    public string Content { get; set; } 
} 

public class Section 
{ 
    public long ID { get; set; } 

    public IList<ArticleMetadata> Articles { get; set; } 
} 

И здесь являются соответствующими частями картографирования:

<class name="Article" table="Article"> 
</class> 

<!-- Note that there's no explicit NHibernate inheritance mapping here --> 
<class name="ArticleMetadata" table="Article"> 
</class> 

<class name="Section" table="Section"> 
    <bag name="Articles" cascade="all-delete-orphan" inverse="true" lazy="false"> 
     <key column="SectionID" /> 
     <one-to-many class="ArticleMetadata" /> 
    </bag> 
</class> 

Надеется, что это не все ясно до сих пор.

То, что я пытаюсь сделать, заключается в следующем: при выборе объектов Section я хочу, чтобы они содержали только «легкие» объекты ArticleMetadata. Но при сохранении Section к БД, я хочу NHibernate сохраняться Article объектов, а также:

var section = new Section(); 
section.Articles.Add(new ArticleMetadata("a1")); 
section.Articles.Add(new Article("a2", "massive clob")); 

session.SaveOrUpdate(section); 

В настоящее время SaveOrUpdate выхода без каких-либо ошибок бы то ни было, но полномасштабный Article объект будет сохранен только частично. То есть значение его свойства «Content» никогда не попадает в БД.

Сохранение Article отдельно (session.Save(new Article(...));) работает должным образом, сохраняя все отображаемые свойства.

Подводя итог: хочу добавить и ArticleMetadata, и Article объектов в коллекцию Section.Articles, и хотим, чтобы они были сохранены надлежащим образом. Возможно ли такое поведение вообще?

ответ

3

Я знаю, что это не является прямым решением вашей проблемы (я не думаю, что то, что вы делаете, может работать без сопоставления наследования, а затем у вас тоже загружен клоб).

Один из способов сделать то, что кажется вам нужным, состоит в том, чтобы сделать Content ленивым загруженным свойством и отбросить наследование.

Подробнее о ленивых нагруженных свойствах можно найти здесь: http://ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspx

Другого способа иметь две коллекции, один для статей и один для ArticleMetadata.

0

Я думаю, что вам нужно будет упорствовать в объектах Article, чтобы заставить их работать. Я предполагаю, что раздел-каскад рассматривает их как ArticleMetadata и, следовательно, сохраняет их как таковые.

В противном случае, если вы не укажете каскадирование и используйте session.Create (новая статья()) вместо них, то, возможно, механизм флеша позаботится об этом для вас. Каскадирование полезно, только если вы явно не создаете объекты afaik.

Один указатель, хотя. Чтобы НЕ загружать полностью взорванную статью, когда вы выбираете ArticleMetadata, вы должны указывать полиморфизм = «явный» для вашего сопоставления классов в ArticleMetadata, иначе он будет идентифицировать наследование и каждый раз выбирать вашу статью по отдельному запросу.