在 WCF 数据服务应用程序中迁移实体框架 6 和 VS2013 后无法更新或删除

Posted

技术标签:

【中文标题】在 WCF 数据服务应用程序中迁移实体框架 6 和 VS2013 后无法更新或删除【英文标题】:Cannot update or delete after migrating EntityFramwork 6 and VS 2013 in WCF Data Service application 【发布时间】:2013-12-18 09:29:09 【问题描述】:

迁移到 EntityFramework 和 VS 2013 后,我无法更新或删除资源。

Request URL:service.svc/Orders(22354)
Request Method:DELETE
Status Code:500 Internal Server Error
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,fr;q=0.6
Host:localhost
Origin:http://localhost
Proxy-Connection:keep-alive
Referer:orders.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)         Chrome/31.0.1650.57 Safari/537.36
X-Requested-With:XMLHttpRequest

我有以下错误:

   <?xml version="1.0" encoding="UTF-8"?>
   <m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
       <m:code />
       <m:message xml:lang="fr-FR">An error occurred while processing this request.</m:message>
       <m:innererror>
           <m:message>Could not find any resources appropriate for the specified culture or the neutral culture.  Make sure "System.Data.Services.resources" was correctly embedded or linked into assembly "Microsoft.OData.EntityFrameworkProvider" at compile time, or that all the satellite assemblies required are loadable and fully signed.</m:message>
           <m:type>System.Resources.MissingManifestResourceException</m:type>
           <m:stacktrace>at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName)&#xD;
      at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark&amp; stackMark)&#xD;
      at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark&amp; stackMark)&#xD;
      at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)&#xD;
      at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)&#xD;
      at System.Data.Services.TextRes.GetString(String name, Object[] args)&#xD;
      at System.Data.Services.Providers.ObjectContextServiceProvider.SetConcurrencyValues(Object resource, Nullable`1 checkForEquality, IEnumerable`1 concurrencyValues)&#xD;
      at System.Data.Services.UpdatableWrapper.SetETagValues(Object resourceCookie, ResourceSetWrapper container)&#xD;
      at System.Data.Services.DataService`1.HandleDeleteOperation(RequestDescription description, IDataService dataService)&#xD;
      at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;
      at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;
      at System.Data.Services.DataService`1.HandleRequest()</m:stacktrace>
       </m:innererror>
   </m:error>

有什么想法吗?

感谢您的帮助。

【问题讨论】:

看起来更新后你的资源文件错过了配置,看看这个特定的资源,看看它的配置是否为嵌入式。 资源错误似乎是 EntityFrameworkProvider 在尝试查找资源文件以翻译第一条错误消息时抛出的第二个错误...我认为第一个错误是由 System. Data.Services.Providers.ObjectContextServiceProvider.SetConcurrencyValues 但我不知道为什么。当我删除 Order 类中的导航属性时,我不再有错误。 赞成这个问题,因为我遇到了同样的问题。有关遇到此问题或类似问题的其他人,请参阅blogs.msdn.com/b/astoriateam/archive/2013/10/02/… 的 cmets。请注意,我的模型中没有枚举,这是报告的原因之一。 这里有同样的问题,也没有枚举。听起来当发生任何数据服务错误时(在我的情况下,保存某些实体时可能是模型错误)在尝试从资源文件中获取错误消息时出现错误(不存在或不存在) t 编译成 EntityFrameworkProvider)。我没有看到 System.Data.Services.resources 的任何资源文件,但我在其中一个包中看到了 Microsoft.Data.Services.resources,它们会起作用吗?如果我决定尝试,我会在这里发帖.. 在寻找 ETag 时发生在提供程序中。看来System.Data.Services.UpdatableWrapper() 调用了在Microsoft.OData.EntityFrameworkProvider.dll 中实现的IConcurrencyProvider。 (我在 SymbolSource 或任何其他符号主机上找不到 Microsoft.OData.EntityFrameworkProvider.dll 的任何 PDB 符号)我在查看 UpdatableWrapper() 方法后的直觉反应是因为 bool? checkForEquality 初始化为 null,表明 Microsoft.OData.EntityFrameworkProvider.ddl 中的 IConcurrencyProvider 实现可能无法正确处理 null checkForEquality 值。 【参考方案1】:

如果有人想尝试这个解决方案......我也有同样的问题。如果我将分离的实体附加到上下文然后尝试更新/删除它,似乎会出现此错误。

Entity entity; //detached

context.AttachTo("entitySetName", entity);
context.DeleteObject(entity);
context.SaveChanges(); //exception

这对我有用。

//get entity from context instead of attaching the "old" one
var newEntity = ctx.Table.Where(w => w.ID == Entity.ID).FirstOrDefault();

context.DeleteObject(newEntity);
context.SaveChanges(); //works

【讨论】:

【参考方案2】:

在我们的例子中,让客户端设置SaveChangesOptions.Batch 会引发此异常。将其设置为SaveChangesOptions.BatchWithIndependentOperations 没有抛出,但我们不能在我们的场景中使用 BatchWithIndependentOperations。希望这可以节省其他人浪费的时间。

【讨论】:

【参考方案3】:

对于那些不使用 Microsoft OData 客户端的人,我通过强制我的客户端使用 MERGE 请求而不是 PUT 请求来解决这个问题。

【讨论】:

以上是关于在 WCF 数据服务应用程序中迁移实体框架 6 和 VS2013 后无法更新或删除的主要内容,如果未能解决你的问题,请参考以下文章

实体框架数据未使用 Wcf 服务保存或更新

使用 WCF 和实体框架的客户端服务器

实体框架6代码首先用oracle更新实体

WCF 和 IIS 的实体框架问题

Ninject 和 WCF Web 服务使实体框架变慢

在我的wcf服务中用实体框架实现的WCF服务的性能?