Изменения дб фиксации NHibernate без explict звонят, чтобы сохранить или обновить

Согласно это описание битовых полей , существует метод для определения и доступа к полям непосредственно. Пример в этой записи идет:

struct preferences {
    unsigned int likes_ice_cream : 1;
    unsigned int plays_golf : 1;
    unsigned int watches_tv : 1;
    unsigned int reads_books : 1;
}; 

struct preferences fred;

fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;

if (fred.likes_ice_cream == 1)
    /* ... */

кроме того, там существует предупреждение:

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

7
задан 4 September 2009 в 17:33
поделиться

2 ответа

Во время на странице: - Я получаю объект

Если вы получаете объект из сеанса, вы неправильно понимаете Update. Обновление предназначено для присоединения существующего объекта к сеансу. Если вы получаете объект из сеанса, он уже прикреплен к этому сеансу, поэтому обновление не имеет смысла.

SaveOrUpdate vs. Update в этом случае не имеет значения - то же самое.

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

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

Итак, чтобы ответить на ваш вопрос, если проверка не удалась, вы не хотите фиксировать транзакцию.

NH также категорически относится к шаблону «Единица работы». Поэтому, если вы выполняете фиксацию в логической части программы, отличной от вашей бизнес-логики, которая проверяет работу, это, вероятно, вызовет трение.

Я не хочу совершать транзакцию.

NH также придерживается шаблона «Единица работы». Поэтому, если вы выполняете фиксацию в логической части программы, отличной от вашей бизнес-логики, которая проверяет работу, это, вероятно, вызовет трение.

Я не хочу совершать транзакцию.

NH также придерживается шаблона «Единица работы». Поэтому, если вы выполняете фиксацию в логической части программы, отличной от вашей бизнес-логики, которая проверяет работу, это, вероятно, вызовет трение.

17
ответ дан 6 December 2019 в 07:51
поделиться

Я только что столкнулся с той же проблемой. Ответ Эйстона был очень полезным, объяснив, что не имеет значения, вызываете ли вы ISession.Update (объект) или SaveOrUpdate (объект), NH отслеживает изменения, и фиксация транзакции зафиксирует изменения.

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

using (ITransaction tx = session.BeginTransaction())
{
    // get your object
    // do your validation

    // if you pass validation:
    tx.Commit();

    // if not, roll it back
    tx.Rollback();
}

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

if (!myObj.ValidateForSave())
{
    session.Evict(myObj);
}

Поступая таким образом, вы можете придерживаться своей отдельной транзакции, начиная ее в начале страницы и фиксируя в конце. Если ваш объект не прошел проверку, его не будет в сеансе, и никакие изменения не сохранятся в базе данных.

5
ответ дан 6 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: