Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 尝试从断开连接的实体更新实体_Wcf_Entity Framework_Entity Framework 4 - Fatal编程技术网

Wcf 尝试从断开连接的实体更新实体

Wcf 尝试从断开连接的实体更新实体,wcf,entity-framework,entity-framework-4,Wcf,Entity Framework,Entity Framework 4,好的,每次我遇到这种情况,我都会来回挣扎,直到我找到解决它的方法(这通常不是我想要解决它的方法) 我所说的是EF中断开连接的实体,它们应该更新数据库中的现有实体 我将在这里举一个我的问题的例子(这个例子是我最后一次遇到这个问题,导致我写这个问题) 我有一个使用实体框架的WCF服务。另一个向我的服务添加了服务引用的程序已正常获得实体的代理版本 这种情况下,服务的使用者现在构造这个代理类的对象,并在WCF服务上调用UpdateEntity方法。此实体具有指向另一种类型实体的外键,并且我要将此新实体链

好的,每次我遇到这种情况,我都会来回挣扎,直到我找到解决它的方法(这通常不是我想要解决它的方法)

我所说的是EF中断开连接的实体,它们应该更新数据库中的现有实体

我将在这里举一个我的问题的例子(这个例子是我最后一次遇到这个问题,导致我写这个问题)

我有一个使用实体框架的WCF服务。另一个向我的服务添加了服务引用的程序已正常获得实体的代理版本

这种情况下,服务的使用者现在构造这个代理类的对象,并在WCF服务上调用UpdateEntity方法。此实体具有指向另一种类型实体的外键,并且我要将此新实体链接到的实体的主键也作为参数发送到此方法。在这种情况下,我希望更新数据库中具有相同主键的实体。看起来很简单,对吧

我的方法现在看起来像这样:

public bool ChangeEntity(MyEntity entity, int otherTableForignKey)
{
  //first I verify that the entity to update exist in the system
  var entitytochange = entityContext.MyEntities.FirstOrDefault(e => e.Name == entity.Name);
  if (systemtochange == null) return false;
  try
  {
    entity.ForignEntity = entityContext.ForeignEntities.FirstOrDefault(f => f.Key == otherTableForignKey);
    //code for updating the entity should go here, but I'm nor sure what
    entityContext.SaveChanges();
    return true;
  }
  catch (Exception exc)
  {
    return false;
  }
}
我尝试了许多不同的组合,包括
ApplyCurrentValues
Attach
,将
ObjectState
设置为Modified等等,但我得到的错误消息是,我无法添加与现有实体具有相同键的新实体,无法添加新对象的对象状态,等等

因此,我的问题是:在不编写看起来像大黑客的代码的情况下,最好的方法是什么

我现在唯一的方法就是将
实体的属性手动设置为更改
实体的属性,但这是一个糟糕的解决方案,因为如果我不记得在这个方法中添加代码,那么任何添加到
MyEntity
的属性都会破坏代码,似乎真的应该有另一种更好的方法

编辑

当我放置
entityContext.MyEntities.ApplyCurrentValues(实体)时我的评论放在上面,我在这一行得到以下异常:

The existing object in the ObjectContext is in the Added state. Changes can only be applied when the existing object is in an unchanged or modified state.
但是,如果我删除了
entity.ForignEntity=entityContext.ForeignEntities.FirstOrDefault(f=>f.Key==otherTableForignKey)上面的这一行
然后
ApplyCurrentValues
可以正常工作


为什么我要将对象的ForeignEntity设置为Added状态?因此,似乎在分离的实体上设置一个属性,将其附加到上下文,状态为added?

如果使用
ApplyCurrentValues
?@LadislavMrnka,会发生什么?请参见上面的编辑。