2016-08-30 5 views
1

Я пытаюсь сделать обновление на записи в моей базе данных, используя linq2sql, однако, я получаю следующее исключение брошенное:Linq2Sql DuplicateKeyExceptionwhile делает обновление

'System.Data.Linq.DuplicateKeyException' in System.Data.Linq.dll ("Cannot add an entity with a key that is already in use.") System.Data.Linq.DuplicateKeyException 

Хотя я понимаю, что исключение говорит мне , как это возможно при выполнении обновления? Я не вставляю какие-либо данные так реалистично, что никакие ключи не должны обновляться?

var Printer = db.Printers.FirstOrDefault(p => p.id == i.PrinterId); 
Printer.CenterId = GetCenterId(i.NewCenterCode); 
Printer.LastCenterCode = i.NewCenterCode; 
db.SubmitChanges(); 

Любые идеи?

+0

ли 'CenterId' есть ограничение уникальности? Выполняете ли вы какие-либо операции с вашим контекстом 'db' перед фрагментом кода, который вы показали? – user3185569

+0

@ user3185569 или 'LastCenterCode', если на то пошло –

+0

Ни один из них не имеет уникального ограничения, единственными 2 уникальными столбцами являются ID (первичный ключ) и MacAddress (который в этом случае не обновляется) – mauzilla

ответ

0

Возможно, вы используете слишком большой dbcontext и что dbcontext уже управляет той же самой записью, которую вы пытаетесь обновить.

Попробуйте использовать новый dbcontext для выполнения обновления. Dbcontexts предназначены для создания и использования часто используемых.

https://stackoverflow.com/a/3151724/711061

+0

Это очень хорошо может быть , мое приложение фильтрует CSV с около 60 тыс. записей, и я создаю один dbcontext для каждого класса. Я запускаю большое количество циклов, так лучше ли создавать новый контекст в каждом цикле? – mauzilla

+0

Ну .. нет. Dbcontext должен использоваться локально для выполнения как можно большей атомной работы. Вы определяете, что является атомным и минимальным. Я бы использовал один dbcontext для цикла и, возможно, для всего метода обновления. – sam

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