我已经尝试了这种创建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;
}
不确定这是否是最佳方式,但似乎有效。
答案 0 :(得分:0)
我认为只是创建一个实体不会添加它,这就是你必须附加它的原因。此方法是一种相当危险的方法,因为它不允许更新备用密钥。在这种情况下,实体将不具有Id,但应具有定义用于更新的备用密钥的适当属性。