Есть проблема с EF 4.0 и ObjectStateManager (я думаю) - PullRequest
1 голос
/ 10 марта 2011

У меня серьезная проблема, у меня есть уникальный ключ на поле в БД, я использую Oracle (Devart Provider).

Первый раз, когда я преформирую Вставку -> (_objectSet.Add(entity)) через мой репозиторий, все в порядке,

Кстати: я использую модель только код и CTP5.

Тогда, если я захочу вставить его снова, выдается сообщение об ошибке, что у меня есть «ограничение уникального ключа», и это тоже хорошо.

После этого, что бы я ни делал, это всегда выдает мне одну и ту же ошибку!

Что это и как это исправить?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Вы пытаетесь создать .Add (сущность) с той же сущностью?Тогда вы получите эту ошибку.Если вы хотите что-то изменить в этой сущности, просто внесите изменения, такие как "entity.rowname = value", а затем сохраните, не пытаясь сделать .Add (entity), и все должно работать нормально.

Как обычносделать это примерно так.

Создать новую строку в базе данных:

Entity entity = new Entity();
entity.value = value;
db.Entity.AddObject(entity);
db.SaveChanges();

Получить и отредактировать строку:

var entity = db.Entity.SingleOrDefault(e => e.value == value);
entity.value = newValue;
db.SaveChanges();

Вы также можете сделать что-то вроде этогобез проблем

Entity entity = new Entity(); //creating a new Entity
entity.value = 1;             //Setting a value on the new Entity
db.Entity.AddObject(entity);  //Adding the Entity to the context
db.SaveChanges();             //Saving the record to the database
entity = db.Entity.SingleOrDefault(e => e.value == 2); //retrieving another, already added record 
entity.value = 5;             //Changing the value on the retrieved record
db.SaveChanges();             //Saving the change to the database
entity = new Entity();        //creating yet another new Entity
entity.value = 8;             //setting the value on the second new Entity
db.Entity.AddObject(entity);  //adding the Entity to the context
db.SaveChanges();             //Saving the second new Entity to the database

Вы можете НЕ сделать так

var entity = db.Entity.SingleOrDefault(e => e.value == value);
entity.value = newValue;
db.Entity.AddObject(entity); //WRONG!
db.SaveChanges();

Или это

Entity entity = new Entity();
entity.value = value;
db.Entity.AddObject(entity);
db.SaveChanges();
entity.value = newValue;
db.Entity.AddObject(entity); //WRONG!
db.SaveChanges();

В этом случае он попытаетсявставьте уже отслеживаемый объект в качестве новой строки с тем же ключом, и он будет жаловаться, что уже существует предыдущая строка с тем же ключом, выдавая ошибку «ограничение уникального ключа».

0 голосов
/ 17 марта 2011

Ответ проще, чем я думал, мне просто нужно вытащить сущность из контекста. После того, как я получу исключение дублирующихся сущностей или любое исключение, которое содержится в контексте, правильный способ - это детализировать сущность и все..

Я получил ответ от Андрея в Devart.

0 голосов
/ 10 марта 2011

@ IamStalker, не могли бы вы указать более подробную информацию об ошибке?
Если возможно, пожалуйста, оставьте здесь сообщение или отправьте нам образец кода, который вы используете для добавления и обновления сущности, или даже небольшой тестовый проект с кодом POCO объектов БД.

...