Dynamics CRM 365 解决方案的处理:将实体加入解决方案、导出解决方案
using FakeXrmEasy; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; using Microsoft.Xrm.Sdk.Metadata.Query; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Tooling.Connector; using System; using System.Collections.Generic; using System.IO; using System.IO.Packaging; using System.Linq; using System.ServiceModel.Description; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace Wbf.Crm.Test { class Program { private Dictionary<string, byte[]> _files = new Dictionary<string, byte[]>(); static void Main(string[] args) { Console.WriteLine("开始"); Console.WriteLine("请输入连接字符串"); string pageName = "rxxx0200617"; var adminServiceVi = getorgan(); ExportSolutionRequest request = new ExportSolutionRequest() { SolutionName = "ruan_20200617", Managed = false }; ExportSolutionResponse exportSolutionResponse = (ExportSolutionResponse)adminServiceVi.Execute(request); byte[] exportXml = exportSolutionResponse.ExportSolutionFile; string filename = "rxx0200617.zip"; File.WriteAllBytes(".//" + filename, exportXml); Console.WriteLine("Solution exported to {0}.", ".//" + filename); return; Console.WriteLine("请输入解决方案名称"); string DefaultSolution = pageName; while (string.IsNullOrWhiteSpace(DefaultSolution)) { Console.WriteLine("解决方案不能为空,请重新输入"); DefaultSolution = Console.ReadLine(); } var solution = CrmHelper.GetSolution(adminServiceVi, DefaultSolution); if (solution == null) { Console.WriteLine($"解决方案{DefaultSolution}不存在"); } //指定实体 var listVi = CrmHelper.GetAllEntity(adminServiceVi); int count = listVi.Count; Console.WriteLine($"总共【{count}】个实体"); int i = 0; foreach (var item in listVi) { if (i < 199) { i++; continue; } if (i > 500) { break; } AddSolutionComponentRequest addReq = new AddSolutionComponentRequest() { ComponentType = 1,//1:entity 2:字段 61:webresoure ComponentId = item.MetadataId.Value, DoNotIncludeSubcomponents = true, //是否不包含其他组建 SolutionUniqueName = DefaultSolution }; adminServiceVi.Execute(addReq); #region 加入视图 //var viewList = CrmHelper.GetEntityView(adminServiceVi, item.ObjectTypeCode.Value); //foreach (var viewEn in viewList.Entities) //{ // AddSolutionComponentRequest addReq22 = new AddSolutionComponentRequest() // { // ComponentType = 26,//view // ComponentId = viewEn.Id, // DoNotIncludeSubcomponents = true, // SolutionUniqueName = DefaultSolution // }; // adminServiceVi.Execute(addReq22); //} #endregion #region 加入窗体 //var formList = CrmHelper.GetEntityForm(adminServiceVi, item.ObjectTypeCode.Value); //foreach (var viewEn in formList.Entities) //{ // AddSolutionComponentRequest addReq33 = new AddSolutionComponentRequest() // { // ComponentType = 60,//view // ComponentId = viewEn.GetAttributeValue<Guid>("formid"), // DoNotIncludeSubcomponents = true, // SolutionUniqueName = DefaultSolution // }; // adminServiceVi.Execute(addReq33); //} #endregion Console.WriteLine($"已完成{i++}/{count}"); } Console.WriteLine(DateTime.Now.ToString()); Console.WriteLine("结束"); Console.ReadKey(); return; #region 实体加入解决方案 //if (entity.ToLower()=="all") //{ // var list = CrmHelper.GetAllEntity(svc); // int count = list.Count; // Console.WriteLine($"总共【{count}】个实体"); // int i = 0; // //List<EntityMetadata> list0_100 = new List<EntityMetadata>(); // //for (var kk = 0; kk <= 30; kk++) // //{ // // list0_100.Add(list[kk]); // //} // foreach (var item in list) // { // AddSolutionComponentRequest addReq = new AddSolutionComponentRequest() // { // ComponentType = 1,//1:entity 2:字段 61:webresoure // ComponentId = item.MetadataId.Value, // DoNotIncludeSubcomponents = false, //是否只需要实体 // SolutionUniqueName = DefaultSolution // }; // svc.Execute(addReq); // Console.WriteLine($"已完成{i++}/{count}"); // } //} //else //{ // //获取组件ID,添加到解决方案 // var respone = CrmHelper.GetEntityResponse(svc, entity); // AddSolutionComponentRequest addReq = new AddSolutionComponentRequest() // { // ComponentType = 1,//entity // ComponentId = (Guid)respone.EntityMetadata.MetadataId, // DoNotIncludeSubcomponents = true, //是否只需要实体 // SolutionUniqueName = DefaultSolution // }; // svc.Execute(addReq); //} //Console.WriteLine(DateTime.Now.ToString()); //Console.WriteLine("结束"); //Console.ReadKey(); #endregion #region 增加webresoure //QueryExpression query = new QueryExpression("webresource"); //query.Criteria.AddCondition("iscustomizable", ConditionOperator.Equal, true); ////query.Criteria.AddCondition("displayname", ConditionOperator.Equal, "资源测试"); //var ec = svc.RetrieveMultiple(query); //int i = 0; //foreach (var en in ec.Entities) //{ // AddSolutionComponentRequest addReq = new AddSolutionComponentRequest() // { // ComponentType = 61,//entity // ComponentId = en.Id, // DoNotIncludeSubcomponents = false, // SolutionUniqueName = pageName // }; // svc.Execute(addReq); // Console.WriteLine($"已完成{i++}/{ec.Entities.Count}"); //} #endregion #region 增加实体、字段、N:1关系到解决方案 //var listVi = CrmHelper.GetAllEntity(adminServiceVi); //int count = listVi.Count; //Console.WriteLine($"总共【{count}】个实体"); //int i = 0; //foreach (var item in listVi) //{ // if (i < 439) // { // i++; // continue; // } // if (i >= 499) // { // return; // } // AddSolutionComponentRequest addReq = new AddSolutionComponentRequest() // { // ComponentType = 1,//1:entity 2:字段 61:webresoure // ComponentId = item.MetadataId.Value, // DoNotIncludeSubcomponents = true, //是否不包含其他组建 // SolutionUniqueName = DefaultSolution // }; // adminServiceVi.Execute(addReq); // var attAtt = CrmHelper.GetEntityResponse(adminServiceVi, item.LogicalName); // //加入字段 // foreach (var att in attAtt.EntityMetadata.Attributes) // { // AddSolutionComponentRequest addReq2 = new AddSolutionComponentRequest() // { // ComponentType = 2,// // ComponentId = (Guid)att.MetadataId, // DoNotIncludeSubcomponents = true, // SolutionUniqueName = pageName // }; // adminServiceVi.Execute(addReq2); // } // //加入N:1关系 // var linkList = CrmHelper.GetEntityRelationship(adminServiceVi, item.LogicalName); // foreach (var link in linkList) // { // AddSolutionComponentRequest addReq2 = new AddSolutionComponentRequest() // { // ComponentType = 10, // ComponentId = (Guid)link.MetadataId, // DoNotIncludeSubcomponents = true, // SolutionUniqueName = pageName // }; // adminServiceVi.Execute(addReq2); // } // Console.WriteLine($"已完成{i++}/{count}"); //} //Console.WriteLine(DateTime.Now.ToString()); //Console.WriteLine("结束"); //Console.ReadKey(); //return; #endregion #region 导出解决方案代码 //ExportSolutionRequest request = new ExportSolutionRequest() // { // SolutionName = "t_20200818", // Managed = false // }; // var aaa = orgProxy.Timeout; // orgProxy.Timeout = new TimeSpan(100,1,1); // ExportSolutionResponse exportSolutionResponse = (ExportSolutionResponse)svc.Execute(request); // byte[] exportXml = exportSolutionResponse.ExportSolutionFile; // string filename = "t_20200818.zip"; // File.WriteAllBytes(".//" + filename, exportXml); // Console.WriteLine("Solution exported to {0}.", ".//" + filename); // return; #endregion #region 创建实体 //var listSer = CrmHelper.GetAllEntity(adminServiceSer, true); //// 获取组件ID,添加到解决方案 //string entityName = ""; //if (!string.IsNullOrWhiteSpace(entityName)) //{ // if (listSer.Exists(x => x.LogicalName == entityName)) // { // return; // } // var respone = CrmHelper.GetEntityResponse(adminServiceVi, entityName); //从源系统找实体 // CrmHelper.CreateEntity(adminServiceSer, respone.EntityMetadata); //创建收目标系统 //} //else //{ // var listVi = CrmHelper.GetAllEntity(adminServiceVi); // int count = listVi.Count; // Console.WriteLine($"总共【{count}】个实体"); // int i = 0; // foreach (var item in listVi) // { // if (listSer.Exists(x => x.LogicalName == item.LogicalName)) // { // Console.WriteLine($"已完成{i++}/{count}"); // continue; // } // CrmHelper.CreateEntity(adminServiceSer, item); // Console.WriteLine($"已完成{i++}/{count}"); // } //} #endregion } public static IOrganizationService getorgan() { ClientCredentials credentials = new ClientCredentials(); //IFD部署 credentials.UserName.UserName = "crmuat\\xxxxx"; credentials.UserName.Password = "xxxx"; Uri organizationUri = new Uri("https://xxxxx/Organization.svc"); Uri homeRealmUri = null; OrganizationServiceProxy orgProxy = new OrganizationServiceProxy(organizationUri, homeRealmUri, credentials, null); IOrganizationService _service = (IOrganizationService)orgProxy; return _service; } } public class CrmHelper { /// <summary> /// 获取实体窗体 /// </summary> /// <param name="service"></param> /// <param name="objecttypecode"></param> /// <returns></returns> public static EntityCollection GetEntityForm(IOrganizationService service, int objecttypecode) { QueryExpression query = new QueryExpression("systemform"); query.Criteria.AddCondition("objecttypecode", ConditionOperator.Equal, objecttypecode); return service.RetrieveMultiple(query); } /// <summary> /// 获取实体视图 /// </summary> /// <param name="service"></param> /// <param name="objecttypecode">实体编码</param> /// <returns></returns> public static EntityCollection GetEntityView(IOrganizationService service, int objecttypecode) { //查询实体对应的视图 QueryExpression mySavedQuery = new QueryExpression { ColumnSet = new ColumnSet("savedqueryid", "name", "querytype", "isdefault", "returnedtypecode", "isquickfindquery", "fetchxml"), EntityName = "savedquery", Criteria = new FilterExpression { Conditions = { //new ConditionExpression //{ // AttributeName = "querytype", // Operator = ConditionOperator.Equal, // Values = {0} //}, new ConditionExpression { AttributeName = "returnedtypecode", Operator = ConditionOperator.Equal, Values = { objecttypecode } } } } }; RetrieveMultipleRequest retrieveSavedQueriesRequest = new RetrieveMultipleRequest { Query = mySavedQuery }; RetrieveMultipleResponse retrieveSavedQueriesResponse = (RetrieveMultipleResponse)service.Execute(retrieveSavedQueriesRequest); return retrieveSavedQueriesResponse.EntityCollection; } /// <summary> /// 获取实体关系 /// </summary> /// <param name="service"></param> /// <param name="entityname"></param> /// <returns></returns> public static List<OneToManyRelationshipMetadata> GetEntityRelationship(IOrganizationService service,string entityname) { List<OneToManyRelationshipMetadata> models = new List<OneToManyRelationshipMetadata>(); MetadataFilterExpression EntityFilter = new MetadataFilterExpression(LogicalOperator.And); EntityFilter.Conditions.Add(new MetadataConditionExpression("LogicalName", MetadataConditionOperator.Equals, entityname)); MetadataPropertiesExpression EntityProperties = new MetadataPropertiesExpression() { AllProperties = false }; EntityProperties.PropertyNames.AddRange(new string[] { "ManyToOneRelationships" }); //N:1 MetadataFilterExpression AttributeFilter = new MetadataFilterExpression(LogicalOperator.Or); AttributeFilter.Conditions.AddRange(new MetadataConditionExpression[] { }); RetrieveMetadataChangesRequest request = new RetrieveMetadataChangesRequest() { Query = new EntityQueryExpression() { Criteria = EntityFilter, Properties = EntityProperties, RelationshipQuery = new RelationshipQueryExpression() { Criteria = AttributeFilter, Properties = new MetadataPropertiesExpression() { AllProperties = true } }, LabelQuery = new LabelQueryExpression() } }; RetrieveMetadataChangesResponse resp = (RetrieveMetadataChangesResponse)service.Execute(request); foreach (OneToManyRelationshipMetadata item in resp.EntityMetadata[0].ManyToOneRelationships) //N:1 { models.Add(item); //if (item.IsCustomRelationship.HasValue&&item.IsCustomRelationship.Value) //{ // models.Add(item); //} } return models; } public static void CreateEntity(IOrganizationService svc, EntityMetadata copyEn) { CreateEntityRequest createrequest = new CreateEntityRequest { //Define the entity--实体的定义 Entity= copyEn, //Entity = new EntityMetadata //{ // SchemaName = copyEn.LogicalName, // DisplayName = copyEn.DisplayName, // DisplayCollectionName = copyEn.DisplayCollectionName, // Description = copyEn.Description, // OwnershipType = copyEn.OwnershipType, // IsActivity = copyEn.IsActivity//, // MetadataId=copyEn.MetadataId //}, // Define the primary attribute for the entity--定义实体的主字段 PrimaryAttribute = new StringAttributeMetadata { SchemaName = copyEn.PrimaryNameAttribute, RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None), MaxLength = 100, FormatName = StringFormatName.Text, DisplayName = new Label("Bank Name", 1033), Description = new Label("The primary attribute for the Bank entity.", 1033) }, SolutionUniqueName = "CodeCreate20220801" }; svc.Execute(createrequest); Console.WriteLine($"The bank {copyEn.LogicalName} entity has been created."); } /// <summary> /// 获取所有实体信息 /// </summary> /// <returns></returns> public static List<EntityMetadata> GetAllEntity(IOrganizationService service,bool isall=false) { List<EntityMetadata> crmEntities = new List<EntityMetadata>(); RetrieveAllEntitiesRequest retrieveAll = new RetrieveAllEntitiesRequest { EntityFilters = EntityFilters.Entity, // EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.Attributes, //查询字段 RetrieveAsIfPublished = true }; var response = (RetrieveAllEntitiesResponse)service.Execute(retrieveAll); //crmEntities = response.EntityMetadata // .Where(x => x.DisplayName.UserLocalizedLabel != null && x.MetadataId != null && x.ObjectTypeCode.HasValue && x.IsCustomizable.Value // && x.CollectionSchemaName.Contains("new_")) // .ToList(); if (isall) { crmEntities = response.EntityMetadata.ToList(); } else { crmEntities = response.EntityMetadata .Where(x => x.DisplayName.UserLocalizedLabel != null && x.MetadataId != null && x.ObjectTypeCode.HasValue && x.IsCustomizable.Value&&x.LogicalName.Contains("new_") ) .ToList(); } return crmEntities; } /// <summary> /// 获取实体数据 /// </summary> /// <param name="service"></param> /// <param name="entityName"></param> /// <returns></returns> public static RetrieveEntityResponse GetEntityResponse(IOrganizationService service, string entityName) { RetrieveEntityRequest request = new RetrieveEntityRequest(); request.EntityFilters = Microsoft.Xrm.Sdk.Metadata.EntityFilters.Attributes; //查询字段 request.LogicalName = entityName; return (RetrieveEntityResponse)service.Execute(request); } /// <summary> /// 获取解决方案,没有就新增 /// </summary> /// <param name="svc"></param> /// <param name="solutionName">解决方案唯一名称</param> /// <returns></returns> public static Entity GetSolution(IOrganizationService svc, string solutionName) { QueryExpression querySolution = new QueryExpression("solution"); querySolution.Criteria.AddCondition("uniquename", ConditionOperator.Equal, solutionName); querySolution.ColumnSet = new ColumnSet(true); var ec = svc.RetrieveMultiple(querySolution); if (ec.Entities.Count > 0) { return ec.Entities[0]; } else { return null; } } } }
记得收藏并关注,掌握更多相关知识!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
2020-07-29 Dynamic CRM 365 启用用户systemuser、修改用户systemuser的时候报错:The selected object could not be found. Verify that the object exists in both the database and Active Directory.