我从CRM生成实体,如下所示:
CrmSvcUtil.exe /url:http://<servername>/<organizationname>/XRMServices/2011/Organization.svc
/out:<outputfilename>.cs /username:<username> /password:<password> /domain:<domainname>
/namespace:CRMEntities /serviceContextName:XrmServiceContext
Run Code Online (Sandbox Code Playgroud)
对于serviceContextName,我设置了XrmServiceContext.我想使用下一个代码从CRM中检索一些实体:
var context = new XrmServiceContext(myorgserv);
var marketingList = context.ListSet.Where(item => item.Id == new Guid("SOME GUID"));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Message "Unable to cast object of type 'Microsoft.Xrm.Sdk.Entity' to type 'CRMEntities.List'."
Run Code Online (Sandbox Code Playgroud)
在"添加到监视"之后,我看到上下文中的每组实体都有相同的消息.我错过了什么?
我正在提取营销列表清单.正如我这样做,根据我使用intellisense的检查,这似乎是一次成功的操作.当我寻找时,...Entities[0].Attributes["nick"]我得到一个对象(在其中的某个地方有正确的数据).但是我不能以编程方式访问它(相反,我必须像猴子一样点击,通过优点来折叠好东西).
事实上,我得到的实体应该使用下面的代码.问题是它们不Strings符合计算机.它们属于类型Microsoft.Xrm.Sdk.AliasedValue,我不知道如何访问其中的实际缺口.
new Contact
{
Name = element.Attributes["nick"] as String,
Mail = element.Attributes["mail"] as String
}
Run Code Online (Sandbox Code Playgroud)
Intellisense说Value它就在那里(而且它也是正确的值)但是我无法通过输入来访问它.Value.我怀疑我需要使用"as"或类似的东西,但此刻我被卡住了.任何提示?As它String应该起作用,它给了我null......
我已经读过这篇文章以及其他几个喜欢它和我看到它的方式,我应该能够访问那里所有有趣的东西.我不能......
我注意到下面的代码得到我的数据,我这么拼命试图让,但这个不能成为一个专业的语法,可以吗?!说真的,它看起来像一个患有多动症和宿醉的高中生试图这样做......
new Contact
{
Name = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["nick"]).Value,
Mail = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["mail"]).Value
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,认真 - 这是一段丑陋的代码......必须有一个更好的方法!但是,我担心没有,因为这个讨论似乎也在使用这种语法......
我试图在Dynamics CRM 2011中表示大于100,000,000,000(Decimal数据类型的最大值)的数字.看起来这样做的唯一方法是使用Currency字段或使用文本字段.这些选项都不是很吸引人.
在Dynamics CRM中表示大数字的最佳方法是什么?
我已经为我们的报价产品注册了一个插件.该插件在我们的测试环境中运行良好.我已经测试了很多次.然后在主服务器中注册该插件.但是,会出现以下情况:当我首先创建或更新报价产品时,报价产品表格会变灰:

点击报价表后,出现错误.没有可用的日志文件(如您所见).我调试了插件,但也没有错误.单击"确定"后,错误消失,所需业务发生在报价产品上(对于税收字段).意味着插件代码没有错误并且工作得很好.代码如下:
using System;
using System.Diagnostics;
using System.Linq;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Xrm;
using System.Collections.Generic;
using Microsoft.Xrm.Sdk.Deployment;
public class Plugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity entity;
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
{
entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName != "quotedetail") { return; }
}
else
{
return;
}
try
{
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(
typeof(IOrganizationServiceFactory));
IOrganizationService service =
serviceFactory.CreateOrganizationService(context.UserId);
if (context.MessageName == "Create")
{
Entity QuoteProduct = (Entity)context.InputParameters["Target"];
Guid QPID …Run Code Online (Sandbox Code Playgroud) 如何在同步插件中确定哪些字段发生了变化?
插件在更新时注册.
类似于JavaScript中的isDirty():
// TODO: Implement your custom Plug-in business logic.
IOrganizationService service = localContext.OrganizationService;
Entity account = (Entity)localContext.PluginExecutionContext.InputParameters["Target"];
if (account.GetAttributeValue<String>("address1_latitude").isDirty())
{
service.Create(new Lead { FirstName = "LOCATION CHANGED" }); // this is a stub
}
Run Code Online (Sandbox Code Playgroud) 我完全清楚Microsoft不支持删除CRM Dynamics 2011中的用户(SystemUser Entity).
但是,我们目前正在开发一种工具来支持我们的用户配置需求.为了能够为此工具编写集成测试,之后似乎必须能够删除用户,以便我们可以将测试环境回滚到原始状态.
目前,我们通过从SQL备份恢复组织来实现这一点,但这对于每次测试运行来说都是非常耗时的.
到目前为止,我们拥有的最佳解决方案是在集成测试中创建用户,断言我们需要断言的所有内容,然后通过禁用用户并删除其AD凭据来"清理它",以便我们可以重用这些下次运行测试的凭据.
但是,由于我们只是在寻找测试环境的解决方案,我真的希望有一个能够正确清理所有内容的解决方案:删除SQL中的记录似乎是要走的路.但是,由于数据库结构复杂,我希望有人可以为此提供脚本.
我们已经创建了脚本以手动从SQL中删除用户(请参阅已接受的答案).这不受支持,因此只有在测试环境中使用它,如果您知道自己在做什么.
c# microsoft-dynamics integration-testing dynamics-crm dynamics-crm-2011
CRM 2011在前提下.
我有一个用C#编写的插件.它可能会抛出异常或在生产中表现不佳.
当发生这种情况时,我想捕获有关状态和最近代码执行的信息,以帮助我分析问题.
理想情况下,我想要以下内容:
如果代码决定我应该知道一个问题,那么我希望它能够告诉我尽快出现问题,而我没有看到问题是否已经发生.
我希望能够轻松获取有关该问题的信息.我不想让RDP到另一台机器并搜索文件.
我不希望日志记录对性能产生太大影响.
我想我正在寻找这样的东西:
我对CRM很新,但我以前开发过这样的系统.由于CRM已经存在多年,我希望它可以用于它.
我知道从CRM外部执行批量更新时,ExecuteMultipleRequest是一个巨大的性能助推器.我不知道的是从CRM插件中调用它是否有益.
我目前的理解是,使用ExecuteMultipleRequest获得的主要性能是实际的SOAP消息传递成本.因此(用于更新5000条记录)而不是发送5000条单独的Soap消息(每条消息必须被序列化,验证,传输等),所有这些都必须发送到服务器,您只能发送一条包含5000条记录的消息.但是当从插件调用时,您已经在服务器上,因此不必进行SOAP调用,因此使用它没有任何好处.
我还没有看到其他一些潜在的好处吗?
我正在寻找包含MS Dynamics CRM系统视图或保存的高级查找视图的条件记录的表.每个保存的视图(系统视图或自定义视图)都有一些用于过滤结果的条件.我想在数据库中找到包含此条件的表作为记录.
我需要能够从ODataQueryOptions转换为RestRequest,以便能够使用指定的过滤器发出RestRequest,并创建了以下帮助程序类:
public static class ODataQueryFilterToRestClient
{
public static RestRequest Map(ODataQueryOptions odataQuery)
{
var restRequest = new RestRequest();
if (odataQuery.Filter != null)
{
restRequest.AddQueryParameter(@"$filter", odataQuery.Filter.RawValue);
}
if (odataQuery.Top != null)
{
restRequest.AddQueryParameter(@"$top", odataQuery.Top.RawValue);
}
if (odataQuery.Skip != null)
{
restRequest.AddQueryParameter(@"$skip", odataQuery.Skip.RawValue);
}
if (odataQuery.OrderBy != null)
{
restRequest.AddQueryParameter(@"$orderby", odataQuery.OrderBy.RawValue);
}
//etc
return restRequest;
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于OdataQueryOptions支持以下内容:
有没有更简单的方法在ODataQueryOptions与RestClient或其他其他客户端代理之间进行转换?
另外,我不知道是否有更好的方法通过控制器接受参数而不是ODataQueryOptions?