for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Не фоксом единым
   :: Помощь сайту :: 

Что может быть причиной ошибки?
Александр Жевелев
Автор

Сообщений: 2633
Откуда: Новосибирск
Дата: 01.12.17 10:05:39ОтветитьЦитировать
c#
иногда с некоторых рабочих мест при выполнении оператора
  
   public FOXEntities db; //контекст Entity, соответственно olistdse - таблица в  модели edmx (c mssql)  
  ....  
   olistdse ll2 = new olistdse();   
                             ...  
      ll2 = db.olistdse.FirstOrDefault(q => q.draft == xx)  // строка с № 1523;
прилетает ошибка :
Цитата:
Элемент с тем же ключом уже был добавлен.
mscorlib
в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
в System.Data.Objects.ObjectStateManager.AddEntityEntryToDictionary(EntityEntry entry, EntityState state)
в System.Data.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded)
в System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
в lambda_method(Closure , Shaper )
в System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
в System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
в System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
в System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable`1 sequence)
в System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
в System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
в System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source, Expression`1 predicate)
в PlanMVVM.Models.Состояние_заказа.mForm_O_2M.Formir_Outmym() в D:\MyDocs\FoxC#\PlanMVVM\PlanMVVM\Models\Состояние_заказа\mForm_O_2M.cs:строка 1523
в PlanMVVM.Models.Состояние_заказа.mForm_O_2M.vibor() в D:\MyDocs\FoxC#\PlanMVVM\PlanMVVM\Models\Состояние_заказа\mForm_O_2M.cs:строка 1006 ЗАКАЗ= 722№ 815 state=Open

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



Исправлено: Александр Жевелев, 01.12.17 10:32
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
Igor Korolyov

Сообщений: 31835
Дата: 01.12.17 11:48:12ОтветитьЦитировать
Полагаю что что-то не то с уникальными ключами в модели. Или в связях сущностей (FK).
Естественно не имея БД и полного исходного кода можно только гадать что там не так... А что не воспроизводится - значит на это влияют настройки той сессии или БД (если зависит от БД а не конкретного клиента) - скажем способ сравнения строк (если зачем то используются строковые ключи).

P.S.
Александр Жевелев
PlanMVVM.Models.Состояние_заказа.mForm_O_2M
Китайских идентификаторов ещё добавьте для полного счастья. А лучше буковки C и о в этом #$%^ пропишите латиницей. Пускай потом наследник этого кода застрелиться


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

Сообщений: 2633
Откуда: Новосибирск
Дата: 04.12.17 05:15:25ОтветитьЦитировать
Igor Korolyov
Полагаю что что-то не то с уникальными ключами в модели. Или в связях сущностей (FK).
Естественно не имея БД и полного исходного кода можно только гадать что там не так... А что не воспроизводится - значит на это влияют настройки той сессии или БД (если зависит от БД а не конкретного клиента) - скажем способ сравнения строк (если зачем то используются строковые ключи).
База данных одна у всех пользователей. Дистрибутив программы у всех пользователей одинаков.
фрагмент модели и таблица в базе[attachment 28622 su_table_thumb.jpg][attachment 28623 basa_table_thumb.jpg]
Ratings: 0 negative/0 positive



Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

Сообщений: 2633
Откуда: Новосибирск
Дата: 04.12.17 05:28:24ОтветитьЦитировать
Igor Korolyov
... потом наследник этого кода застрелиться
для наследников есть описание проекта на 219 страницах
дополнительные исследования показали что ошибка возникает и на других таблицах, но всегда на FirstOrDefault . Ошибка возникает достаточно редко(2- 3 раза в месяц) у 1-3 пользователей из 30 ежедневно использующих программу.
в качестве шаманского действа установил у таблиц используемых только для чтения MergeOption.NoTracking буду наблюдать далее... Все ошибки мне прилетают на почту - буду следить.



Исправлено: Александр Жевелев, 04.12.17 08:10
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
Igor Korolyov

Сообщений: 31835
Дата: 04.12.17 11:20:23ОтветитьЦитировать
Ключ таблицы дробное число :puke:
Архитектора - расстрелять.

Вероятно в цепочке decimal <-> ADO.NET-ный внутренний тип <-> MSSQL-ный numeric происходит "потеря точности". Начинает "плясать" младший знак, и вроде как "разные" элементы получают "одинаковый" ключ, на что и ругается (совершенно справедливо) внутренний Dictionary контекста (отслеживающий "связанные" с контекстом сущности).
Впрочем, я не исключаю что MS в принципе не тестировал сценарий с дробным числом в качестве первичного ключа

У нас, насколько я помню, были сходные проблемы с дробными числами - при сохранении детектился "конфликт" именно из за проблем округления. НО, это было для "обычных" полей, конечно же, да и оракловский number очень сильно отличается в реализации от MSSQL-ного decimal/numeric - по крайней мере на уровне провайдера

Тут пишут конкретно про проблемы EF-decimal-MSSQL.

Александр Жевелев
для наследников есть описание проекта на 219 страницах
Это ничуть не оправдывает использование смеси кириллицы и латиницы в идентификаторах...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

Сообщений: 2633
Откуда: Новосибирск
Дата: 05.12.17 04:16:32ОтветитьЦитировать
Igor Korolyov
Ключ таблицы дробное число :puke:
Архитектора - расстрелять.

Вероятно в цепочке decimal <-> ADO.NET-ный внутренний тип <-> MSSQL-ный numeric происходит "потеря точности". Начинает "плясать" младший знак, и вроде как "разные" элементы получают "одинаковый" ключ, на что и ругается (совершенно справедливо) внутренний Dictionary контекста (отслеживающий "связанные" с контекстом сущности).
Впрочем, я не исключаю что MS в принципе не тестировал сценарий с дробным числом в качестве первичного ключа

У нас, насколько я помню, были сходные проблемы с дробными числами - при сохранении детектился "конфликт" именно из за проблем округления. НО, это было для "обычных" полей, конечно же, да и оракловский number очень сильно отличается в реализации от MSSQL-ного decimal/numeric - по крайней мере на уровне провайдера

Тут пишут конкретно про проблемы EF-decimal-MSSQL.

Александр Жевелев
для наследников есть описание проекта на 219 страницах
Это ничуть не оправдывает использование смеси кириллицы и латиницы в идентификаторах...

Спасибо, Игорь! Буду думать и читать.В конкретном случае дробный ключ это всегда рукотворное данное никогда не вычисляемое.(Чертеж-исполнение в конструкторской документации у нас принято хранить в виде чертеж.исполнение(Numeric(13,2) ) Смущает что аналогичные ошибки прилетали и на Numeric(10,0). Все равно есть направление для дальнейших исследований. Спасибо. (в коде программ кириллицы нигде нет - это только имена папок)
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
spinz

Сообщений: 5262
Дата: 05.12.17 04:25:40ОтветитьЦитировать
Александр Жевелев
Чертеж-исполнение в конструкторской документации у нас принято хранить в виде чертеж.исполнение(Numeric(13,2)

Чота кажется более логичным разбить эту связку на два поля
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
ВладимирС

Сообщений: 1191
Дата: 05.12.17 06:13:57ОтветитьЦитировать
spinz
Александр Жевелев
Чертеж-исполнение в конструкторской документации у нас принято хранить в виде чертеж.исполнение(Numeric(13,2)

Чота кажется более логичным разбить эту связку на два поля
Я так же думаю... Причем поля д.б. целочисленные, ИМХО.
Либо использовать текстовое поле, с дальнешим парсингом.



Исправлено: ВладимирС, 05.12.17 06:52
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
pasha_usue

Сообщений: 2907
Откуда: Е-бург
Дата: 05.12.17 10:28:14ОтветитьЦитировать
Фигня. Лучше оставить целое. Чертеж всегда инкрементировать на 100, а исполнение - на единицу. А при выводе - форматировать. А можно вообще всегда запрашивать с сервера сразу и ключ и представление.
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
Igor Korolyov

Сообщений: 31835
Дата: 05.12.17 11:09:14ОтветитьЦитировать
1) "Имена папок" по умолчанию влияют на пространство имён, в которые помещаются соответствующие классы - так что кириллица в идентификаторах таки ЕСТЬ. Ибо идентификатор это полное имя класса, включая пространство имён - не только его хвост. Конечно же можно вручную всегда перебивать namespace, но как по мне, так проще соблюдать рекомендованную нотацию применимо и к подпапкам внутри проектов... Впрочем, даже не разбираясь особо в тонкостях нотаций, просто посмотри на приведенный стэктрейс - имена в первых строках (кроме псевдо-имени lambda_method) и в 2 последних - очевидна же "смесь стилей"

2) Если это поле по сути "шифр" то всё же лучше сделать поле строковым и использовать шаблонный (по маске) ввод (если оно вводится руками, а не генерируется - впрочем, можно и генератор "уникальных номеров" замутить, если это необходимо). Можно, конечно, и домножать на 100 и хранить как целое - но это только если есть железная гарантия что завтра (или через 5 лет, когда все уже надёжно всё забудут) не потребуется отводить под вторую часть 3 знака или больше, или вдруг не захотят буковки в шифр ввести. Да, во времена доса у нас тоже любили хранить бухгалтерский счёт/субсчёт в поле N(5,2) - и даже покруче извращения были - но сейчас так делать точно не стоит...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

Сообщений: 2633
Откуда: Новосибирск
Дата: 09.02.18 06:15:39ОтветитьЦитировать
Прошло чуть более 2-х месяцев - нет ни одной ошибки!
единственное мое действо -"установил у таблиц используемых только для чтения MergeOption.NoTracking "
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 57 and Guests: 57


© 2000-2018 Fox Club 
Яндекс.Метрика