2016-01-28 4 views
0

У нас есть два проекта C#, один из которых - веб-приложение, а другое - консольное. Оба используют NHibernate + Fluent для любых манипуляций с базой данных. Оба приложения работают на одном компьютере.Обновление базы данных NHibernate

Однако мы замечаем, что когда консольное приложение обновляет базу данных, те же самые объекты в веб-приложении становятся устаревшими и что более важно, обновляя их в веб-приложении, а затем сохраняя их, сохраняет старый объект обратно БД, потеряв обновление из консольного приложения.

Есть ли механизм или настройка для предотвращения такого поведения без вызова метода .Refresh для каждого объекта каждый раз, когда мы используем/ссылаемся на него?

ответ

1

Да, вы можете использовать объекты с версией, но в случае сохранения устаревшего объекта он просто выдает исключение, говорящее, что вы пытаетесь сохранить устаревший объект. Вам нужно будет справиться с этим.

Nhibernate документация на колонке версии: http://nhibernate.info/doc/nhibernate-reference/mapping.html#mapping-declaration-version

Есть несколько сообщений переполнения стека об этом, а также: When to use Nhibernate <version>? How do you do Versioning in Nhibernate?

https://ayende.com/blog/3946/nhibernate-mapping-concurrency

Редактировать

Если вы не» t хотите изменить способ обработки ваших сеансов пару вещей, которые вы можете сделать.

Вызов ISession.Clear() в некоторый момент, чтобы очистить все в сеансе, чтобы последующие вызовы ISession.Get возвратили объекты из базы данных, а не кэш.

Вызов ISession.Evict() для конкретного экземпляра объекта. Это приведет к удалению объекта из кеша, а последующие вызовы возвратят объекты из базы данных, а не кэш.

https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/ISession.cs

+0

Привет Коул, спасибо за ответ, это, безусловно, решает эту проблему я обращенную. Знаете ли вы, есть ли какой-либо параметр в NHibernate, который не позволит ему кэшировать все эти объекты, так что когда я их извлечу с помощью .Get, он ВСЕГДА приведет его к извлечению из БД, а не к кешу. Это уже решит большинство моих проблем без необходимости реализации свойства версии. – Rok

+0

Обычно, если я извлекаю объект из базы данных, а пользователь редактирует его и сохраняет его, я использую 2 сеанса. 1 для получения исходной информации для отображения, а другой - для получения обновления, когда пользователь сохраняет его. В любом случае, сеансы должны быть короткими. Я думаю, что это обычно так, как большинство людей делают такие вещи. –

+0

Коул, конечно, я понимаю. У меня есть внешнее приложение, которое вносит изменения в приложение, поэтому оно никак не связано с моей сессией. Я хотел бы заставить мою сессию вызывать все запросы .Get для извлечения из БД, а не использовать кешированные (и часто устаревшие) объекты. Это настраивается? – Rok

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