Как решить "Пакетное обновление возвратило неожиданный счетчик строк из обновления, фактическое количество строк: 0; ожидается: 1" проблема?
Получение этого каждый раз, когда я пытаюсь СОЗДАТЬ конкретную сущность... просто хочу знать, как я должен разобраться в причине.
Я использую автоматическое использование Fluent NHibernate, поэтому, возможно, я не установил соглашение соответствующим образом и/или не должен переопределять somethings в одном или нескольких файлах сопоставления. Я пошел через несколько сообщений в Интернете относительно этой проблемы и с трудом выяснял, почему именно это происходит в моем случае.
Объект, который я сохраняю, довольно прост. Это объект "Человек", который ссылается на объект "Компания" и имеет коллекцию объектов "Адрес". UPDATES отлично работают с существующими объектами Person, которые уже находятся в базе данных.
Предложения?
Спасибо -wg
Ответы
Ответ 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;
}
}
}