【问题标题】:Updating an entity record in CRM using Entity Framework使用实体框架更新 CRM 中的实体记录
【发布时间】:2015-11-22 08:42:46
【问题描述】:

我最近一直在尝试使用 CRM CrmSvcUtil.exe 的 SDK 工具中自动生成的代码来更新 CRM 2015 实体中的记录 使用代码

CrmConnection con = new CrmConnection("CRM");
XrmServiceContext ctx = new XrmServiceContext(con);
var nn = ctx.TestEntity.Where(x => x.Name== "12132").FirstOrDefault();
nn.Name="test";
ctx.SaveChanges();

但是在保存更改后所做的所有更改都被忽略了,我注意到更改记录的实体状态仍然没有改变。

当使用ctx.UpdateObject(nn);ctx.Update(mm); 时,应用程序会抛出以下错误:

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://schemas.microsoft.com/xrm/2011/Contracts/Services:request 时出错。 InnerException 消息是“第 1 行位置 13371 中的错误。元素“http://schemas.datacontract.org/2004/07/System.Collections.Generic:value”包含映射到名称“http://schemas.microsoft.com/xrm/7.1/Contracts:ConcurrencyBehavior”的类型的数据。反序列化器不知道映射到此名称的任何类型。考虑更改 DataContractResolver 上 ResolveName 方法的实现,以返回名称“ConcurrencyBehavior”和命名空间“http://schemas.microsoft.com/xrm/7.1/Contracts”的非空值。”。有关详细信息,请参阅 InnerException。

或者这个

EntityState 必须设置为 null、Created(用于创建消息)或 Changed(用于更新消息)

当尝试手动更改实体状态时出现此错误

实体是只读的,不能修改“EntityState”属性。改为使用上下文来更新实体。

知道我可以使用 ctx.AddObject() 使用相同的自动生成代码创建新记录

【问题讨论】:

    标签: dynamics-crm crm dynamics-crm-2015


    【解决方案1】:

    您应该在调用ctx.SaveChanges() 之前使用ctx.UpdateObject

    UpdateRequest.ConcurrencyBehavior 是在 CRM 2015 更新 1 中引入的。在我看来,您的 CRM 版本与您使用的 CrmSvcUtil 版本不匹配。您必须使用较新版本的 SDK 工具。

    由于您使用的是 RTM 版本的 CRM,您可以下载并使用相应的 RTM 版本的CRM 2015 SDK core tools (version 7.0.1)。使用该版本的 CrmSvcUtil 重新生成上下文后,您应该不会再看到与 UpdateRequest.ConcurrencyBehavior 相关的任何错误。

    【讨论】:

    • 我在本地使用 Microsoft Dynamics® CRM 2015 (7.0.0.3543) (DB 7.0.0.3543),如果我使用 update 或 updateObject 将触发异常,如问题所示
    • 好的。在这种情况下,您可以获得 SDK 工具的 RTM 版本。我已经相应地更新了答案。
    猜你喜欢
    • 2021-09-21
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多