2013-09-16 3 views
0

Проблемы:Nhibernate счетчик неожиданного ряд растет после удаления

я получаю сообщение об ошибке:

Batch update returned unexpected row count from update; actual row count: 0; expected: 1

когда некоторый объект удален от выборки и удаления. После любого следующего удаления строки подсчета и ожидается, растут в течение, например:

Batch update returned unexpected row count from update; actual row count: 11; expected: 12

Код:

var queueEntry = _session.Query<MyTable>().FirstOrDefault(x => x.Id == id); 
if (queueEntry != null) 
{ 
    _session.Delete(queueEntry); 

    try 
    { 
     _session.Flush(); 
    } 
    catch (Exception ex) 
    { 
     _session.Clear(); 
    } 

    return 1; 
} 

Попытки:

я пытался несколько вещей, но безуспешно, я Эти строки были добавлены в статье catch:

_session.Disconnect(); 
_session.Reconnect(); 

Я попытался обернуть весь код, который я поместил здесь с транзакцией, а вместо _session.Flush() Я положил transaction.Commit().

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

Это mapping by code

public class MyTable : IEntity 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Type { get; set; } 
    public virtual string Source { get; set; } 
    public virtual string OperationType { get; set; } 
    public virtual bool IsVisible { get; set; } 
    public virtual DateTime? Timestamp { get; set; } 
    public virtual string ContentId { get; set; } 
    public virtual int Priority { get; set; } 
} 

Вопрос:

Есть ли способ сбросить это expected значения, так что я могу продолжать извлекать значения без исключения?

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

EDIT:

Addtional информация: эта таблица очереди в течение длительного запущенного процесса, он не имеет дочерних таблиц, только несколько вещей, которые полезно для обслуживания. Отправленные отображения. Это происходит через некоторое время, а не после первого удаления.

+0

Почему не получить запись с 'Session.Get'? –

+0

@ AlessandroD'Andria в этом случае не имеет никакого значения, но спасибо за подсказку. – wudzik

+0

Есть ли у этого лица дети? Можете ли вы показать нам свои сопоставления? –

ответ

0

мне удалось какое-то решение, может быть, не лучший, но работает:

catch (Exception ex) 
{ 
    _session = _session.SessionFactory.OpenSession(); 
} 

если открытие нового сеанса это потери информации о количестве строк и отлично работает в следующий раз.

2

Обычно эта ошибка означает, что оператор SQL успешно выполнен, но ROWCOUNT, возвращаемый SQL Server, равен 0, а не 1, как ожидалось.

Для этого может быть несколько причин, например неправильные сопоставления, триггеры, которые отключили строку.

Вы сможете получить четкое представление об этой проблеме, проверив выполнение SQL-запросов на сервере sql. Это можно сделать либо путем включения журнала nHibernate sql, либо с использованием профилировщика sql. После того, как у вас есть SQL, вы можете знать причину, если не попробовать запустить SQL вручную и посмотреть, что произойдет.

Кроме того, если вы можете оставить отображение, это поможет людям определить любые вопросы

+0

Прочтите мое редактирование, пожалуйста, есть мое сопоставление + больше информации – wudzik

-1

Эта проблема из SessionFactory

использования SessionFactory.SaveOrUpdate

+0

Можете ли вы опубликовать код? – segarci

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