CRM 2016早期绑定实体的通用创建或更新方法

时间:2017-01-04 12:54:14

标签: c# dynamics-crm dynamics-crm-2016

我已经尝试了这种创建CRM的方法。

internal Guid CreateOrUpdateRecord(Entity entity)
{
    var guid = Guid.Empty;

    if (entity.Id == null || entity.Id == Guid.Empty)
    {
        guid = _serviceProxy.Create(entity);
    }
    else
    {
        _XRM.UpdateObject(entity);
        _XRM.SaveChanges();
        //_serviceProxy.Update(entity);

        guid = entity.Id;
    }

    return guid;
}

我的目的是,我不需要关心一个对象是新的还是从CRM获得的,这样我的代码就可以设置变量并将其抛入此方法来保存或更新它。有了这个,我不需要在多个地方创建if结构来每次处理这个问题。我将它用于多种实体类型。

然而,代码让我对更新方法感到悲伤。

此代码

_XRM.UpdateObject(entity);
_XRM.SaveChanges()

倾向于抛出:

  

上下文目前尚未跟踪' xxx'实体。

和这个

_serviceContext.Update(entity);

投掷:

  

EntityState必须设置为null,Created(用于创建消息)或   已更改(对于更新消息)CRM C#

所以,关于我应该如何创建单个方法的任何建议我都可以将任何Entity投入其中,并且会相应地更新或创建。

更新 将方法的更新部分更改为:

{
    if(_XRM.IsAttached(entity) == false)
    {
        _XRM.Attach(entity);
    }

    _XRM.UpdateObject(entity);
    _XRM.SaveChanges();
    guid = entity.Id;
}

不确定这是否是最佳方式,但似乎有效。

1 个答案:

答案 0 :(得分:0)

我认为只是创建一个实体不会添加它,这就是你必须附加它的原因。此方法是一种相当危险的方法,因为它不允许更新备用密钥。在这种情况下,实体将不具有Id,但应具有定义用于更新的备用密钥的适当属性。