Есть проблема с 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 объектов БД.