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

 

posted @ 2022-07-29 11:09  溜溜球_小钢wan  阅读(188)  评论(0编辑  收藏  举报