На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> EF бага при вставке/обновлении записи , EF бага при вставке/обновлении записи
    Здравствуйте. При роботе с EF обнаружил интерестный баг, хотел бы спросить совета как его избежать в дальнейшем. При попытке вставку в БД приложение падало с ошибкой
    Цитата
    System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UX_Organization'. Cannot insert duplicate key in object 'dbo.Organization'.

    После фикса со стороны базы (запуска sql скрипта) данные в таблицу вставились, но инкрементые поля стали очень большими. Например в базе было сделано вставку 4 записи, с id ->1,2,3 и 4. А после того как EF запрос все таки выполнился то id следующей записи стал 4796424 например.
    Пример вставки
    ExpandedWrap disabled
      try
                  {
                      using (var systemContext = new SystemDatabaseContext())
                      using (var coverContext = new CoverDatabaseContext())
                      {
                          //Организации сайта
                          var coverOrgs = coverContext
                              .Entity.executives
                              .Select(s => new OrganizationInfo
                                  {
                                      CoverId = s.id,
                                      Name = s.short_name,
                                      Description = s.name,
                                      Edrpou = s.code,
                                      IsEnabled = s.status == 1
                                  })
                              .ToList();
       
                          //Организации сервиса
                          var systemOrgs = systemContext.
                              Entity.Organization.ToList();
       
                          //Организации сайта и сервиса, объединённые по идентификатору организации.
                          var common = coverOrgs.FullOuterJoin(systemOrgs,
                                                               info => info.CoverId,
                                                               organization => organization.CoverOrgId,
                                                               (info, organization, id) => new {organization, info})
                                                .ToList();
       
                          foreach (var joint in common)
                          {
                              if (joint.info == null)
                              {
                                  //Служебная организация. Её нет в БД Cover. Ничего не делаем.
                                  if (String.CompareOrdinal(joint.organization.Edrpou, Common.Constants.SystemEdrpou) == 0)
                                      continue;
       
                                  //Организация была удалена из БД Cover.
                                  //Если нет дочерних систем, удаляем. Если есть - отключаем организацию.
                                  if (!HasSystems(joint.organization))
                                      Remove(systemContext, joint.organization);
                                  else Disable(joint.organization);
       
                                  continue;
                              }
                              if (joint.organization == null)
                              {
                                  //В базе Cover добавилась организация. Добавляем её в системную базу.
                                  Add(systemContext, joint.info);
                                  continue;
                              }
                              if (joint.info.Equals(joint.organization))
                              {
                                  //Организация не изменилась. Ничего не делаем.
                                  continue;
                              }
                              if (String.CompareOrdinal(joint.info.Edrpou, joint.organization.Edrpou) != 0)
                              {
                                  //Изменился код ЕДРПОУ.
                                  //Если нет дочерних систем, обновляем запись. Если есть - отключаем организацию.
                                  if (!HasSystems(joint.organization))
                                      Update(joint.organization, joint.info);
                                  else Disable(joint.organization);
       
                                  continue;
                              }
                              if (joint.info.IsEnabled != joint.organization.IsEnabled)
                              {
                                  //Организация включилась или отключилась в СЕВ.
                                  if (joint.info.IsEnabled)
                                      Enable(joint.organization);
                                  else Disable(joint.organization);
                              }
                              //У организации изменилось название. Обновляем запись.
                              Update(joint.organization, joint.info);
                          }
       
                          systemContext.Entity.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
                      }
                  }
                  catch(Exception ex)
                  {
                      //Если это не последняя попытка обработать элемент,
                      if (!isLastAttempt)
                      {
                          //Логируем ошибку
                          LogService.Error(BusinessLogicResource.OrganizationSynchronizerException, ex);
       
                          //Выходим, указывая, что не смогли обработать пакет.
                          return false;
                      }
       
                      //Последняя попытка обработать пакет завершилась неудачей.
                      //Логируем ошибку
                      LogService.Error(BusinessLogicResource.LastErrorOrganizationsSynchronizer + ex);
                  }
    Буду очень признателен если кто посвятит в чем может быть проблема. Так как судя по MSDN то такая запись
    ExpandedWrap disabled
      using (var systemContext = new SystemDatabaseContext())
    должна работать в транзакции.
      счётчик, наверное с ума сошёл :)
      Что-то типа этого надо:
      ExpandedWrap disabled
        --declare @maxapr int, @maxltr int, @maxbz int
        --
        --Set @maxbz = (select max(PK) from krdtools..BASE)+1
        --
        --dbcc checkident ('krdtools..BASE', RESEED,@maxbz)

      это для скл сервера 2005
        Цитата Koss @
        это для скл сервера 2005

        Посмотрел в MSDN. Пишет что это только для MS SQL Server 2005, а у меня 2008. Но спасибо за наводку. Буду копать дальше.
          Цитата Craft @
          Пишет что это только для MS SQL Server 2005, а у меня 2008.

          там разве такого дбцц нету? О_о

          Добавлено
          http://msdn.microsoft.com/ru-ru/library/ms...sql.100%29.aspx
          вот же! Там и 2010й в списке есть

          Добавлено
          12й*
            Koss Спасибо.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0247 ]   [ 16 queries used ]   [ Generated: 3.05.24, 04:37 GMT ]