【发布时间】: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;
}
不确定这是否是最好的方法,但它似乎有效。
【问题讨论】:
-
Defo 在 2011 年? 2015/2016 对此 msdn.microsoft.com/en-gb/library/dn932135(v=crm.7).aspx 有一个 upsert 函数,
entity.Id == null也是毫无意义的Guid是struct并且不能是null。
标签: c# dynamics-crm dynamics-crm-2016