【问题标题】:Generic Create or Update method for CRM 2016 Early bound entitiesCRM 2016 早期绑定实体的通用创建或更新方法
【发布时间】:2017-01-04 12:54:13
【问题描述】:

我正在尝试为 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;
}

不确定这是否是最好的方法,但它似乎有效。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多