【问题标题】:Have a problem with EF 4.0 and ObjectStateManager (i think)EF 4.0 和 ObjectStateManager 有问题(我认为)
【发布时间】:2011-03-18 03:47:00
【问题描述】:

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

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

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

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

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

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

提前谢谢你。

【问题讨论】:

  • 你应该澄清这是什么意思:“在那之后,无论我做什么,它总是给我同样的错误!”
  • 你说得对,对不起,我确实更改了实体中的所有值(新实体)
  • 您无法对新实体进行更改,因为旧实体已被上下文跟踪。如@zmurf 在他的回答中描述的那样更改旧值中的值。
  • 对不起,我如何获得旧实体?

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


【解决方案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();

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

【讨论】:

  • 正如我上面对楼上的人所说的那样,我做了这些改变,什么也没做。
  • 对不起,我可能被误解了,问题更深。我已经为自己设置了一个唯一约束,如果有人第一次将数据(例如“personid”而不是(主键或唯一键)) ef4 响应确定,则说明您在此列上有唯一键约束,但是如果我将“personid”更改为不同的它仍然说同样的事情,它的工作直到第一次抛出“唯一键约束”之后它停止工作。我认为持有缓存的 Devart 提供程序可能有问题,但他们正在检查它,直到那时我正在等待。
  • 啊..是的..我完全误解了这个问题。在这种情况下,您将不得不(正如您在自己的回答中所说)分离实体。
【解决方案2】:

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

【讨论】:

  • 我已经给你发了一个链接,如果我做的不是它应该做的事情。
  • 三天前我已经向 Devart 支持发送了一封包含项目示例的电子邮件,但没有收到任何答复,为什么?
  • @IamStalker,我们已通过电子邮件回复您。原因似乎是 Insert 实现。添加执行相关实体附加的代码后,一切正常。
  • 不,它不起作用,我已经像您一样附加了您的代码,但它仍然不起作用。
【解决方案3】:

答案比我想的要简单,我只需要从上下文中分离实体, 在我收到重复实体的异常或上下文中存在的任何异常后,正确的方法是分离实体,仅此而已。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2013-12-26
    相关资源
    最近更新 更多