Есть проблема с EF 4.0 и ObjectStateManager (я думаю)

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

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

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

Затем, если я хочу вставить его снова, он выдаст ошибку, что у меня есть "ограничение уникального ключа", и это тоже хорошо.

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

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

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

3 ответа

Решение

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

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

Вы пытаетесь создать.Add(entity) с той же сущностью? Тогда вы получите эту ошибку. Если вы хотите что-то изменить в этой сущности, просто внесите изменения, такие как "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();

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

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

Другие вопросы по тегам