Dynamics crm 当我能够设置值时,为什么我的Enitty.Contains(attributeField)返回false?

Dynamics crm 当我能够设置值时,为什么我的Enitty.Contains(attributeField)返回false?,dynamics-crm,crm,dynamics-crm-2013,Dynamics Crm,Crm,Dynamics Crm 2013,我有一个代码块没有像我想象的那样工作 我已经按照如下方式设置了一个实体,并且具有以前的guid parentEnt = new Entity("vehicle_ent"); parentEnt.id = guid; 现在,当我用声明进行检查时: if (parentEnt.Contains("attribute_field")) { parentEnt["attribute_field"] = "test"; } 由于if语句失败,因此永远不会调用上面的语句 但是,如果我删除if语句

我有一个代码块没有像我想象的那样工作

我已经按照如下方式设置了一个实体,并且具有以前的guid

parentEnt = new Entity("vehicle_ent");
parentEnt.id = guid;
现在,当我用声明进行检查时:

if (parentEnt.Contains("attribute_field")) {
    parentEnt["attribute_field"] = "test";
}
由于if语句失败,因此永远不会调用上面的语句

但是,如果我删除if语句。我能够实际分配和运行代码:

parentEnt["attribute_field"] = "test";

使用Contains方法是否缺少某些内容?我以为它是用来检查实体是否包含属性的

为CRM实体对象运行构造函数并为其分配guid时 像

您正在创建一个实体类型的新对象,其逻辑名称为“vehicle\u ent”,id为“guid”。此时,属于具有该名称的实体的所有属性/属性都不会与实体对象一起创建,并且您只有一个实体类对象,该对象具有逻辑名称和id集

如果要检查具有该id的实体记录是否包含某个属性,则需要使用组织服务从数据库中获取,如

ColumnSet attributes = new ColumnSet(true);
parentEnt = _service.Retrieve("vehicle_ent", guid, attributes);

调用检索后,您可以检查实体记录是否包含需要检查的属性。

在实体类上,无论是否存在,您都可以像您提供的示例那样分配属性。如果它存在,它将覆盖它(这是您发现的)

所以


无论属性是否已指定值,都将始终有效。

我只添加了几点:

语法
实体[attributename]
实体。属性[attributename]
是等效的,原因可以在实体元数据中找到:

public object this[string attributeName] { get; set; } 
该方法在实体级别映射
属性
属性(该属性的类型为
属性集合
继承自
数据集合
,基类型为
IEnumerable

数据收集
包含以下方法:

    // Summary:
    //     Gets or sets the value associated with the specified key.
    //
    // Parameters:
    //   key:
    //     Type: TKey. The key of the value to get or set.
    //
    // Returns:
    //     Type: TValue The value associated with the specified key.
    public virtual TValue this[TKey key] { get; set; }

如果该键以前不存在,则此方法将该键(我们的attributename)添加到集合中。为此,您可以不首先使用
Contains
方法为属性指定值。当然,当您读取值时,需要检查键是否存在,这是
Contains
方法的目的,但是要读取值,也可以使用
GetAttributeValue
(但是需要注意当属性不在集合中时返回的默认值)

请注意,您提出的解决方案需要呼叫crm,在这种情况下,如果他知道id和属性名称,他只需添加列表中不存在的缺少属性,就可以更新实体。我不确定有什么需要知道的,但可以呼叫crm。否则,您将如何检查具有特定guid的实体记录是否包含属性?从所示的示例和所问的问题可以清楚地看出,实体对象在检查之前不包含该属性。在我的回答中,我假设在创建期间实体对象中应该包含一个属性,这似乎是本例中的问题。作为参考,即使在调用crm时,使用all new ColumnSet(true)作为列集,您仍然需要检查返回的实体是否包含该属性,由于字段安全性或记录字段不包含值等不同原因,它可能不包含值。这根本不回答OP问题@BlueSam实际上回答了这个问题。它检查实体是否包含属性值。如果它是实体的有效属性,则不是。
public object this[string attributeName] { get; set; } 
    // Summary:
    //     Gets or sets the value associated with the specified key.
    //
    // Parameters:
    //   key:
    //     Type: TKey. The key of the value to get or set.
    //
    // Returns:
    //     Type: TValue The value associated with the specified key.
    public virtual TValue this[TKey key] { get; set; }