有问题的EF 4.0和ObjectStateManager(我认为)

时间:2011-03-10 07:21:17

标签: c#-4.0 entity-framework-4 ef4-code-only devart

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

我第一次预成型插页 - > (_objectSet.Add(entity))通过我的存储库,没关系,

BTW:我使用的是Code Only模型和CTP5。

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

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

这是什么以及如何解决?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

您是否尝试使用相同的实体执行.Add(实体)?然后你会得到那个错误。如果你想改变该实体中的某些内容,只需执行“entity.rowname = value”之类的更改,然后保存而不尝试执行.Add(实体),它应该可以正常工作。

你通常如何做到这一点。

在数据库中创建新行:

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();

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

答案 1 :(得分:0)

@IamStalker,请您详细说明有关错误的更多细节?
如果可能,请在此处发布或send us您用于添加和更新实体的示例代码,或者甚至是包含数据库对象POCO代码的小型测试项目。

答案 2 :(得分:0)

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

我在Devart得到了安德烈的答案。