Как решить проблему «Пакетное обновление вернуло неожиданное количество строк из-за обновления; фактическое количество строк: 0; ожидаемое: 1»? - PullRequest
28 голосов
/ 03 ноября 2010

Получая это каждый раз, когда я пытаюсь СОЗДАТЬ определенную сущность ... просто хочу знать, как мне поступить, чтобы выяснить причину.

Я использую автоматическое отображение Fluent NHibernate, так что, возможно, я не установилсоглашение соответствующим образом и / или необходимость переопределить что-то в одном или нескольких файлах сопоставления.Я просмотрел несколько постов в Интернете об этой проблеме, и мне было трудно понять, почему это происходит в моем случае.

Объект, который я сохраняю, довольно прост.Это объект «Person», который ссылается на сущность «Company» и имеет коллекцию сущностей «Address».ОБНОВЛЕНИЯ прекрасно работают с существующими объектами Person, которые уже находятся в базе данных.

Предложения?

Спасибо -wg

Ответы [ 4 ]

27 голосов
/ 03 ноября 2010

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

Существует несколько причин, от неправильных отображений доТриггеры UPDATE / INSERT с отключенным счетчиком строк.

Лучше всего профилировать операторы SQL и смотреть, что происходит.Для этого либо включите nHibernate sql logging , либо воспользуйтесь профилировщиком sql.Если у вас есть SQL, вы можете узнать причину, если не попробовать запустить SQL вручную и посмотреть, что произойдет.

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

13 голосов
/ 11 февраля 2014

Это может произойти, когда триггер (-ы) выполняют дополнительные запросы DML (изменение данных), которые влияют на количество строк. Моим решением было добавить следующее в верхней части моего триггера:

SET NOCOUNT ON;
2 голосов
/ 30 апреля 2014

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

0 голосов
/ 16 февраля 2017

При нацеливании на представление с помощью триггера INSTEAD OF может быть практически невозможно получить правильное количество строк.Немного углубившись в исходный код, я обнаружил, что вы можете сделать собственный персистер, который заставит NHibernate игнорировать проверки количества.

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister
{
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping)
        : base(persistentClass, cache, factory, mapping)
    {
        for (int i = 0; i < this.insertResultCheckStyles.Length; i++)
        {
            this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }

        for (int i = 0; i < this.updateResultCheckStyles.Length; i++)
        {
            this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }

        for (int i = 0; i < this.deleteResultCheckStyles.Length; i++)
        {
            this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None;
        }
    }
}
...