【问题标题】:Update just one property in CRM via WCF Data Services通过 WCF 数据服务仅更新 CRM 中的一个属性
【发布时间】:2014-09-06 01:18:31
【问题描述】:

我有一些代码从 CRM 获取对象,然后更新一个属性,然后将其推送回 CRM。我基于组织数据服务 (OData) 生成了 WCF 数据服务上下文。

但是当我尝试发送更新时,它会发送所有加载的属性,而不仅仅是更改的一个,所以我收到拒绝访问异常,因为我的帐户无法更改对象中的所有属性。

我的示例代码:

Guid guid = new Guid("aaa4f83e-0017-e261-9ba4-001517264c77");
Contact contact = context.ContactSet.Where(c => c.ContactId == guid).ToList().First();
contact.New_SomeField = "SomeData";
context.UpdateObject(contact);
DataServiceResponse response = context.SaveChanges();

我检查了它通过 Fiddler 发送的请求,它发送对象具有的所有属性,而不仅仅是更改。有没有办法发送刚刚更改的属性?

如果我手动发送这样的请求,那么它就像一个魅力并且只更新一个属性,但是我如何通过 WCF 数据服务发送类似的请求?

我的样本手册请求:

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <id>http://SomeUrl/XRMServices/2011/OrganizationData.svc/ContactSet(guid'aaa4f83e-0017-e261-9ba4-001517264c77')</id>
    <category term="Microsoft.Crm.Sdk.Data.Services.Contact" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <title type="text">Some Name</title>
    <updated>2014-07-15T17:49:06Z</updated>
    <author>
        <name />
    </author>
    <content type="application/xml">
        <m:properties>
            <d:ContactId m:type="Edm.Guid">aaa4f83e-0017-e261-9ba4-001517264c77</d:ContactId>
            <d:New_SomeField>
                Some Data
            </d:New_SomeField>
        </m:properties>
    </content>
</entry>

谢谢!

更新1

当我尝试创建一个新的内存联系人,填写 id 和需要的属性,然后发送时,它会为未指定的属性发送空值,并且 CRM 会清除除指定对象之外的所有属性,因此在该对象几乎被删除之后.

我的代码:

var guid = new Guid("D866D2A0-1706-E111-845F-001517264C77");
Contact contact = new Contact();
contact.ContactId = guid;
contact.New_SomeField = "SomeData"
context.AttachTo("ContactSet", contact);
context.ChangeState(contact, EntityStates.Modified);
DataServiceResponse newResponse = context.SaveChanges();

请求此代码(我剪掉了一部分,因为它很大):

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <id>http://SomeServer/SomeOrganization/XRMServices/2011/OrganizationData.svc/ContactSet(guid'd866d2a0-1706-e111-845f-001517264c77')</id>
    <category term="Microsoft.Crm.Sdk.Data.Services.Contact" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <title type="text"></title>
    <updated>2014-07-15T19:31:57Z</updated>
    <author>
        <name />
    </author>
    <content type="application/xml">
        <m:properties>
            <d:AccountId m:type="Microsoft.Crm.Sdk.Data.Services.EntityReference">
                <d:Id m:type="Edm.Guid" m:null="true" />
                <d:LogicalName m:null="true" />
                <d:Name m:null="true" />
            </d:AccountId>
            <d:AccountRoleCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:AccountRoleCode>
            <d:Address1_AddressId m:type="Edm.Guid" m:null="true" />
            <d:Address1_AddressTypeCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:Address1_AddressTypeCode>
            <d:Address1_City m:null="true" />
            <d:Address1_Country m:null="true" />
            <d:Address1_County m:null="true" />
            <d:Address1_Fax m:null="true" />
            <d:Address1_FreightTermsCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:Address1_FreightTermsCode>
            <d:Address1_Latitude m:type="Edm.Double" m:null="true" />
            <d:Address1_Line1 m:null="true" />
            <d:Address1_Line2 m:null="true" />
            <d:EducationCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:EducationCode>
            <d:EMailAddress1 m:null="true" />
            <d:FamilyStatusCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:FamilyStatusCode>
            <d:Fax m:null="true" />
            <d:FirstName m:null="true" />
            <d:FtpSiteUrl m:null="true" />
            <d:FullName m:null="true" />
            <d:GenderCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:GenderCode>
            <d:GovernmentId m:null="true" />
            <d:HasChildrenCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
                <d:Value m:type="Edm.Int32" m:null="true" />
            </d:HasChildrenCode>
            <d:JobTitle m:null="true" />
            <d:LastName m:null="true" />
            <d:New_SomeField>
                Some Data
            </d:New_SomeField>
        </m:properties>
    </content>
</entry>

【问题讨论】:

  • 您的代码示例中的“项目”是什么?应该联系吗?
  • 糟糕,我修好了。是的,它使用contact 变量。我想念复制它来回答。原来也是contact

标签: c# wcf dynamics-crm-2011 dynamics-crm wcf-data-services


【解决方案1】:

在内存中创建一个新联系人,填充 id 和要更新的字段,将其添加到上下文中,并让上下文更新它。

【讨论】:

  • 通过 Update1 问题更新。它没有帮助,现在我的代码清除了所有未指定的属性。它不仅发送一个属性,还发送所有属性,但具有空值
  • 这不是我所经历的行为。创建对象并将值设置为 null 应该使用 null 值更新记录。创建一个对象而不设置它们应该不理会它们
  • @SergeyLitvinov 我将支持 Ben 的评论。
  • 嗯。我看到每个实体都继承了INotifyPropertyChanged,因此它可以跟踪空值的变化。但不知何故,它没有。什么可以给出这样的差异?我使用 CRM 11,并在 Visual Studio 2013 中从 Organization Data Service CSDL Url 生成了服务参考...
  • @SergeyLitvinov 通过 crmsvcutil 生成的 Earlybound 实体不会这样做。所有属性都存储在 Attributes 集合中,因此如果从未设置该值,则它永远不会出现在 Attributes 集合中,因此永远不会被发送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多