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

Сообщений: 2723
Откуда: Новосибирск
Дата регистрации: 09.10.2003
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

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



Исправлено 1 раз(а). Последнее : Александр Жевелев, 01.12.17 11:32
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
Igor Korolyov

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

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

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



Исправлено 1 раз(а). Последнее : Александр Жевелев, 04.12.17 09:10
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ключ таблицы дробное число :puke:
Архитектора - расстрелять.

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

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

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

Сообщений: 2723
Откуда: Новосибирск
Дата регистрации: 09.10.2003
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

Сообщений: 5263
Дата регистрации: 21.01.2016
Александр Жевелев
Чертеж-исполнение в конструкторской документации у нас принято хранить в виде чертеж.исполнение(Numeric(13,2)

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

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

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



Исправлено 1 раз(а). Последнее : ВладимирС, 05.12.17 07:52
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Фигня. Лучше оставить целое. Чертеж всегда инкрементировать на 100, а исполнение - на единицу. А при выводе - форматировать. А можно вообще всегда запрашивать с сервера сразу и ключ и представление.
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
Igor Korolyov

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Что может быть причиной ошибки?
Александр Жевелев
Автор

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


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

On-line: 2 (Гостей: 2)

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