2013-06-19 6 views
1

У меня есть запись, которая содержит список комментариев, как показано в файле сопоставления ниже.Объект NHibernate не обновляется после добавления дочернего элемента

Моего сценарий:

  1. добавить новый комментарий к данной записи (как показано в методе SaveComment) и зафиксировать изменения
  2. потом я запрашиваю комментарии на объекте записи домена, но мой новый комментарий еще не добавлено

Является ли NHibnerate использованием устаревших данных кеша здесь? Как я могу это решить?

using (ITransaction transaction = Session.BeginTransaction()) 
{ 
    try 
    { 
     Entry entry = Session.Load<Entry>(message.EntryId); 

     Comment comment = SaveComment(entry, new BroadcastMetadata { some data }); 

     transaction.Commit(); 

     // I access the entry.LatestBroadcast info here 
     // but my entry doesnt have the new comment assigned yet ! 
     var latestData = entry.LatestBroadcast; // is null 
    } 
} 

private Comment SaveComment(Entry entry, BroadcastMetadata broadcastMetadata) 
{ 
    Session.Save(broadcastMetadata); 

    var comment = new Comment 
    { 
     Entry = entry 
     OldBroadcastData = entry.LatestBroadcast, 
     NewBroadcastData = broadcastMetadata 
    }; 
    Session.Save(comment); 

    return comment; 
} 

Мои C# классы:

public class Entry 
{ 
    public virtual BroadcastMetadata LatestBroadcast 
    { 
     get 
     { 
      BroadcastMetadata latestBroadcast = null; 

      Comment broadcastComment = Comments.LastOrDefault(); 
      if (broadcastComment != null) 
      { 
       latestBroadcast = broadcastComment.NewBroadcastData; 
      } 
      else 
      { 
       latestBroadcast = BroadcastData; 
      } 

      return latestBroadcast; 
     } 
    } 

    public virtual IList<Comment> Comments { get; protected set; } 
} 

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

<class name="Entry" table="`LogbookEntry`"> 

    <bag name="Comments" table="LogbookComment" lazy="false" inverse="true"> 
    <key column="EntryId" /> 
    <one-to-many 
     class="LogbookService.Core.Model.Comment, LogbookService.Core" /> 
    </bag> 

<class name="Comment" table="LogbookComment"> 

    <many-to-one name="Entry" column="EntryId" fetch="join" lazy="false" cascade="none" 
     class="LogbookService.Core.Model.Entry, LogbookService.Core" /> 

</class> 

ответ

1

Дело в том, что код C# внутри оператора using {} не присваивает CommentEntry. В этом случае NHibernate только служит для публикации всех изменений в БД.

Othe слова:

  • Comment будут сохранены
  • он будет содержать ссылку на Entry(колонка EntryID будет содержать правильное значение)
  • раз позже Entry будет загружен, он будет содержащие ссылки Comment

Итак, NHibernate работает правильно.

Но в фрагменте кода мы работаем с кодом C#, который не связан с изменениями настойчивости. Поэтому мы должны также явно добавить Comment в коллекцию Entry. Только чистая обработка C# объекта:

var comment = new Comment 
{ 
    Entry = entry 
    ... 
}; 
entry.Comments.Add(comment) 

Примечания: вы отключаете ленивый settings, и я предполагаю, что у вас есть действительно веские причины для этого. Но я бы, по крайней мере, расширил карточку мешка с помощью партии: <bag name="Comments" ... batch-size="25">. Подробнее здесь 19.1.5. Using batch fetching

0

Одна вещь, чтобы отметить, что вы запрашиваете последний комментарий в рамках сделки scope, это означает, что NHibernate не имеет d все еще содержит транзакцию и потенциально все еще извлекает данные кэша, хотя это уже сделано. Попробуйте следующее:

using (ITransaction transaction = Session.BeginTransaction()) 
    { 
     try 
     { 
      Entry entry = Session.Load<Entry>(message.EntryId); 
      Comment comment = SaveComment(entry, new BroadcastMetadata { some data }); 
      transaction.Commit(); 
     } 
    } 

    // i access the entry.LatestBroadcast info here but my entry doesnt have the new comment assigned yet ! 
    var latestData = entry.LatestBroadcast; // is null 

Если это не сработает. Попробуйте очистить сеанс после совершения транзакции, выполнив Session.Flush(). Надеюсь это поможет!

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