Подтвердить что ты не робот

Как решить "Пакетное обновление возвратило неожиданный счетчик строк из обновления, фактическое количество строк: 0; ожидается: 1" проблема?

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

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

Объект, который я сохраняю, довольно прост. Это объект "Человек", который ссылается на объект "Компания" и имеет коллекцию объектов "Адрес". UPDATES отлично работают с существующими объектами Person, которые уже находятся в базе данных.

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

Спасибо -wg

4b9b3361

Ответ 1

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

Есть несколько причин, от неправильных сопоставлений, к триггерам UPDATE/INSERT, которые отключили строку.

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

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

Ответ 2

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

SET NOCOUNT ON;

Ответ 3

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

Ответ 4

При таргетинге на представление с помощью триггера INSTEAD OF может быть почти невозможно получить правильный подсчет строк. После того, как вы немного вникали в источник, я обнаружил, что вы можете создать пользовательский persister, который заставляет 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;
        }
    }
}