LINQ CRM 2011更新-创建

LINQ CRM 2011更新-创建,linq,dynamics-crm,dynamics-crm-2011,Linq,Dynamics Crm,Dynamics Crm 2011,我注意到technet论坛上的CRM主持人David Jennaway指出,您不能在CRM 2011中使用LINQ更新/创建记录,请参见此处 但我看到了一些线索,使它看起来似乎应该工作。这是我的尝试,但没有成功。有什么想法吗 IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))

我注意到technet论坛上的CRM主持人David Jennaway指出,您不能在CRM 2011中使用LINQ更新/创建记录,请参见此处

但我看到了一些线索,使它看起来似乎应该工作。这是我的尝试,但没有成功。有什么想法吗

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

        }
ioorganizationservicefactory serviceFactory=(ioorganizationservicefactory)serviceProvider.GetService(typeof(ioorganizationservicefactory));
IOOrganizationService=serviceFactory.CreateOrganizationService(context.UserId);
OrganizationServiceContext orgContext=新的OrganizationServiceContext(服务);
EntityState=新的EntityState();
状态=EntityState.Changed;
var counter=来自orgContext.CreateQuery()中的c
其中c.pcx_name.包含(“pcx_候选人”)
选择新的pcx\U实体计数器
{Id=c.Id,
pcx_名称=c.pcx_名称,pcx_序列=c.pcx_序列,pcx_前缀=c.pcx_前缀
};
foreach(计数器中的变量c)
{
字符串前缀=c.pcx_prefix.ToString();
string sequence=c.pcx_sequence.ToString();
c、 pcx_序列=c.pcx_序列+1;
c、 实体状态=状态;
**service.Update(c);**//此处失败
}

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

有关可能的解决方案,请参阅以下链接-


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

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

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();
    }
}

这假设
orgContext
service
在方法的作用域之上都可用。否则,它们必须作为附加参数传递。

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