1

我有一个严重的问题,我在 db 中的字段上有一个唯一键,我使用 Oracle(Devart Provider)。

我第一次执行插入 ->(_objectSet.Add(entity))通过我的存储库没关系,

顺便说一句:我使用纯代码模型和 CTP5。

然后,如果我想再次插入它,它会触发一个错误,我有一个“唯一键约束”,它也可以。

在那之后,无论我做什么,它总是给我同样的错误!

那是什么以及如何解决它?

先感谢您。

4

3 回答 3

1

您是否尝试使用同一实体执行 .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();

在这种情况下,它将尝试将已跟踪的实体作为具有相同键的新行插入,并通过抛出“唯一键约束”错误来抱怨已经存在具有相同键的前一行。

于 2011-03-10T09:16:45.943 回答
0

@IamStalker,您能否指定有关该错误的更多详细信息?
如果可能,请在此处发布或向我们发送您用于添加和更新实体的示例代码,甚至是带有您的 DB 对象 POCO 代码的小型测试项目。

于 2011-03-10T10:56:44.050 回答
0

答案比我想的要简单,我只需要从上下文中分离实体,在我收到重复实体的异常或它在上下文中持有的任何异常之后,正确的方法是分离实体,就是这样。

我从德瓦特的安德烈那里得到了这个答案。

于 2011-03-17T19:47:00.610 回答