【问题标题】:LINQ CRM 2011 Update - CreateLINQ CRM 2011 更新 - 创建
【发布时间】:2011-09-02 22:42:01
【问题描述】:

我注意到 technet 论坛上的 CRM 版主 David Jennaway 指出您不能使用 LINQ 在 CRM 2011 中更新/创建记录,请参阅此处http://social.microsoft.com/Forums/en-IE/crmdevelopment/thread/682a7be2-1c07-497e-8f58-cea55c298062

但我已经看到了一些看起来好像它应该工作的线程。这是我的尝试,它不起作用。有什么想法为什么不呢?

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
OrganizationServiceContext orgContext = new OrganizationServiceContext(service);

EntityState state = new EntityState();
state = EntityState.Changed;

var counter = from c in orgContext.CreateQuery<pcx_entitycounter>()
        where c.pcx_name.Contains("pcx_candidate")
        select new pcx_entitycounter
        {Id = c.Id,
        pcx_name = c.pcx_name, pcx_Sequence = c.pcx_Sequence, pcx_Prefix = c.pcx_Prefix

        };

foreach (var c in counter)
        {
            string prefix = c.pcx_Prefix.ToString(); ;
            string sequence = c.pcx_Sequence.ToString();

            c.pcx_Sequence = c.pcx_Sequence + 1;
            c.EntityState = state;
            **service.Update(c);**  //FAILS HERE

        }

【问题讨论】:

  • 这个 LINQ 是如何更新的?我看到您正在运行 LINQ 查询,但不是在实际更新中?你得到了什么例外?
  • 查看异常和所有详细信息肯定会有所帮助。

标签: linq dynamics-crm dynamics-crm-2011


【解决方案1】:

根据我的经验,从上下文中检索实体、对其进行更新、然后使用服务来保存更改是很难做到的。搞清楚它让我头疼!

由于您的检索代码使用来自 Context 的查询,所有这些实体都应附加到 Context 并且正在跟踪它们的状态。因此,您需要使用 Context 的方法进行更新:

foreach (var c in counter) {
    string prefix = c.pcx_Prefix.ToString(); ;
    string sequence = c.pcx_Sequence.ToString();

    c.pcx_Sequence = c.pcx_Sequence + 1;

    // Use the Context to save changes
    orgContext.UpdateObject(c);
    orgContext.SaveChanges();
}

由于我的很多代码会根据情况以不同的方式(即服务或上下文)检索实体,因此我开发了一个简单的方法来知道如何正确更新实体。为了扩展您的示例,您可能有一个如下所示的更新方法:

public void UpdatePcxEntityCounter(pcx_entitycounter c) {
    if (!orgContext.IsAttached(c)) {
        service.Update(c);
    }
    else {
        orgContext.UpdateObject(c);
        orgContext.SaveChanges();
    }
}

这假设orgContextservice 在高于该方法的范围内可用。否则,它们必须作为附加参数传递。

【讨论】:

    【解决方案2】:

    没有看到困难,很难辨别问题是什么,但是您是否尝试过使用 orgContext.UpdateObject(c);在执行更新步骤之前?另外,不确定为什么要将前缀和序列分配给循环中的局部变量,因为它们似乎没有被使用。您可能会收到 SOAP 异常或用于分配不起作用的值的东西。您是否在实体上注册了任何插件?

    查看以下链接了解可能的解决方案 -

    How to update a CRM 2011 Entity using LINQ in a Plugin?

    http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/7ae89b3b-6eca-4876-9513-042739fa432a

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      相关资源
      最近更新 更多