Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.55.14] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. При роботе с 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 например. Пример вставки 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); } using (var systemContext = new SystemDatabaseContext()) |
Сообщ.
#2
,
|
|
|
счётчик, наверное с ума сошёл
Что-то типа этого надо: --declare @maxapr int, @maxltr int, @maxbz int -- --Set @maxbz = (select max(PK) from krdtools..BASE)+1 -- --dbcc checkident ('krdtools..BASE', RESEED,@maxbz) это для скл сервера 2005 |
Сообщ.
#3
,
|
|
|
Цитата Koss @ это для скл сервера 2005 Посмотрел в MSDN. Пишет что это только для MS SQL Server 2005, а у меня 2008. Но спасибо за наводку. Буду копать дальше. |
Сообщ.
#4
,
|
|
|
Цитата Craft @ Пишет что это только для MS SQL Server 2005, а у меня 2008. там разве такого дбцц нету? О_о Добавлено http://msdn.microsoft.com/ru-ru/library/ms...sql.100%29.aspx вот же! Там и 2010й в списке есть Добавлено 12й* |
Сообщ.
#5
,
|
|
|
Koss Спасибо.
|