我有一个严重的问题,我在db中的字段上有一个唯一键,我使用Oracle(Devart Provider)。
我第一次预成型插页 - > (_objectSet.Add(entity))
通过我的存储库,没关系,
BTW:我使用的是Code Only模型和CTP5。
然后,如果我想再次插入它,它会触发一个错误,我有一个“唯一键约束”,它也没问题。
在那之后,无论我做什么,总是会给我带来同样的错误!
这是什么以及如何解决?
提前谢谢。
答案 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得到了安德烈的答案。