2014-01-10 2 views
2

У меня возникает следующая ошибка при вставке новых записей в базу данных с помощью NHibernate.Как разрешить пакетное обновление, возвратил непредвиденную ошибку счетчика строк в NHibernate?

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

У меня есть две таблиц с первичными и внешними отношениями. Я хочу, чтобы вставка записи в обоих таблице .: здесь отображение классов

DemoStudentMap.cs

public DemoStudentMap() { 
      Table("DEMO_Student"); 
      Id(t => t.StudentId).Column("StudentId").GeneratedBy.Identity(); 
      Map(t => t.Name, "Name"); 
      Map(t => t.Class, "Class"); 
      Map(t => t.Board, "Board"); 
      Map(t => t.Enabled, "Enabled"); 
      Map(t => t.Isdeleted).Column("IsDeleted"); 
      Map(t => t.Createddate).Column("CreatedDate"); 
      Map(t => t.Lastmodifyby).Column("LastModifyBy").Nullable(); 
      Map(t => t.Lastmodifieddate).Column("LastModifiedDate").Nullable(); 
      References(x => x.DemoScore).ForeignKey("RollNumber"); 
      } 

DemoScoreMap.cs

public DemoScoreMap() { 
      Table("DEMO_Score"); 
      Id(t => t.rollnumber).Column("RollNumber"); 
      Map(t => t.math, "Math"); 
      Map(t => t.physics, "Physics"); 
      Map(t => t.english, "English"); 
      Map(t => t.enabled, "Enabled"); 
      Map(t => t.isdeleted).Column("IsDeleted"); 
      Map(t => t.createddate).Column("CreatedDate"); 
      Map(t => t.lastmodifyby).Column("LastModifyBy").Nullable(); 
      Map(t => t.lastmodifieddate).Column("LastModifiedDate").Nullable(); 
     } 

Я использую Asp.net WebAPI. В методе Post контроллера Api я получил значения, которые я хочу вставить. Вот мой ApiController:

DemoScoreViewModel newScore = new DemoScoreViewModel(); 
DemoScore score = newScore.ConvertDemoScoreViewModelToDemoS(newStudent, _crudStatusCreate); 
bool resultScore = _demoScoreTask.Create(score); 
DemoStudent student = newStudent.ConvertDemoStudentViewModelToDemoStudent(newStudent, score, _crudStatusCreate); 
bool result = _demoStudentTask.Create(student); 

Здесь я получил значение в «оценке» и «студент» переменный, которые я хочу сохранить в базе данных. У меня есть следующие методы для создания новых записей, которые возвращают результат bool, как показано в коде.

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

Для Студента:

public bool Create(DemoStudent newStudent) 
     { 
      try 
      { 
       _demoStudentRepo.DbContext.BeginTransaction(); 
       _demoStudentRepo.SaveOrUpdate(newStudent); 
       _demoStudentRepo.DbContext.CommitTransaction(); 
      } 
      catch 
      { 
       return false; 
      } 
      return true; 
     } 

Фор Score

public bool Create(DemoScore newScore) 
     { 
      try 
      { 
       _demoScoreRepo.DbContext.BeginTransaction(); 
       _demoScoreRepo.SaveOrUpdate(newScore); 
       _demoScoreRepo.DbContext.CommitTransaction(); 
      } 
      catch 
      { 
       return false; 
      } 
      return true; 
     } 

Примечание: когда я удалить сделку я не получил эту ошибку, но все мои данные не сохраняются ,

+0

Вы уже пробовали свои предложения здесь: http://stackoverflow.com/questions/4083368/how-to-solve-batch-update-returned-unexpected-row-count-from-update-actual-row?rq = 1 – Tallmaris

ответ

2

Наконец-то возникла проблема. Ошибка в Mapping.

public DemoScoreMap() { 
      Table("DEMO_Score"); 
      Id(t=>t.rollnumber).Column("RollNumber").GeneratedBy.Assigned(); 
      Map(t => t.math, "Math"); 
      Map(t => t.physics, "Physics"); 
      Map(t => t.english, "English"); 
      Map(t => t.enabled, "Enabled"); 
      Map(t => t.isdeleted).Column("IsDeleted"); 
      Map(t => t.createddate).Column("CreatedDate"); 
      Map(t => t.lastmodifyby).Column("LastModifyBy").Nullable(); 
      Map(t => t.lastmodifieddate).Column("LastModifiedDate").Nullable(); 
     } 
+1

Честно говоря, здесь я удивлен. Обычно, если Identity должен быть присвоен, NHibernate выдаст INSERT без столбца Id (RollNumber), и мы должны получить исключение: * try ti вставить null в столбец не нуль *. IE не возвращен партию ... А также, пожалуйста, имейте в виду, что после использования 'Assigned' вы не должны использовать SaveOrUpdate. NHibernate в этом сценарии вряд ли может идентифицировать значение asseded vs not-assign ... как описано ниже;) удачи с NHibernate в любом случае. –

+0

Im using Automapping и получение той же ошибки: S –

4

Проблема здесь скрыта в факте, что вызывается SaveOrUpdate(). NHibernate, по некоторым причинам (обсуждается позже) решил назвать «ОБНОВЛЕНИЕ». Но поскольку мы создаем новых экземпляров, обновленное количество строк ... равно 0. В ожидании 1

В чем может быть причина? То, что DemoScore или DemosStudent имеют значение incnosistency по умолчанию значение id и настройку UnsavedValue.

I.e. NHibernate ожидает, что Id == 0 означает, новый ... в то время как любое другое значение (даже отрицательное) будет рассматриваться как существующий объект ... который должен быть обновлен.

Так проверьте, какое значение присваивается идентификатор внутри _demoScoreTask.Create(score);

Заходящее (что 0 означает новый) по умолчанию может быть отрегулирована в отображении, например, .UnsavedValue(-1)

ПРИМЕЧАНИЕ: причина, почему версия без транзакции не выбрасывает исключение, так как Flush() не вызывается. Пожалуйста, проверьте 9.6. Flush. Мы могли бы изменить: sess.FlushMode = FlushMode.Commit; на Авто например, но Commit является подходящим.

+0

Я отлаживал функцию Create, и я обнаружил, что Id равен 0. Который, по моему мнению, верен. Тогда что это дает мне ошибку. ((SharpArch.Domain.DomainModel.EntityWithTypedId ) (newScore)). Id равен 0. –

+0

Попробуйте явно установить 'UnsavedValue (0)'. Кажется, что он установлен на что-то еще (-1). Я почти уверен, потому что SaveOrUpdate делает обновление ... * (я бы сказал) *, и это должно означать, что 0 не указывается как несохраненное значение. * (Примечание. Единственным другим вариантом может быть то, что вставка возвращает 0 строк ... вместо 1, но это кажется мне слишком сложным, например, какой-то триггер или настройка ... так что, скорее всего, это верно) –

+0

где Мне нужно написать UnsavedValue (0). –

4

В моем случае это был идентификационный ключ. В ней отсутствовала логика .GeneratedBy.

Table("JobDetailsBlob"); 
Id(x => x.Id, "JobDetailId"); 

изменен

Table("JobDetailsBlob"); 
Id(x => x.Id, "JobDetailId").GeneratedBy.Assigned(); 

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

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