Olá pessoal,
Bom, hoje vou demonstrar como criar relacionamentos entre uma Entidade Nativa/Customizada e Entidades Virtuais!
Na figura acima, um novo relacionamento (1:N) foi criado entre a entidade Contato (contact) e a entidade virtual External Activity (new_externalentity).
Para aqueles que ainda não viram meus posts anteriores, acesse aqui:
Dynamics 365 – Entidades Virtuais
Dynamics 365 – Dicas para utilizar Entidades Virtuais
Indo ao assunto deste post…
API
O primeiro passo é ter/criar a API que será consumida pela entidade virtual. Neste exemplo, para utilizar o provider nativo (OData V4), precisamos que nossa API implemente este protocolo.
Existem vários exemplos na internet, utilizei este aqui:
Assim, vamos para o Visual Studio, primeiro um screenshot do Solution Explorer para ajudar a se localizar:
Abaixo minha Model (ExternalActivity.cs):
using System; using System.ComponentModel.DataAnnotations; namespace DemoODataV4.Models { public class ExternalActivity { [Key] public Guid ExternalActivityId { get; set; } public int ExternalActivityKey { get; set; } public Guid ContactId { get; set; } public string Subject{ get; set; } public string Details { get; set; } public string From { get; set; } public string To { get; set; } } }
Linha 9: Veja que a chave primária ExternalActivityId é um GUID e tem a anotação “[Key]“.
Linha 13: Atualmente a única maneira de relacionar uma entidade à outra é através do uso de uma atributo do tipo GUID
Agora minha Controller (ExternalActivitiesController.cs):
using DemoODataV4.Datasource; using System.Linq; using System.Web.Http; using System.Web.OData; namespace DemoODataV4.Controllers { public class ExternalActivitiesController : ODataController { [EnableQuery] public IHttpActionResult Get() { return Ok(DemoDataSource.Instance.ExternalActivities.AsQueryable()); } } }
Como eu não tinha uma fonte de dados, decidi criar uma camada de dados falsa/mock, assim, consigo manipular os registros que serão criados. Estou criando 1.000 registros falsos e também uso um gerador randomico de palavras.
Vamos ao código do meu data source (DemoDataSource.cs), vou detalhar melhor logo após ele:
using System; using DemoODataV4.Models; using System.Collections.Generic; using System.Linq; namespace DemoODataV4.Datasource { public class DemoDataSource { private static DemoDataSource instance = null; public static DemoDataSource Instance { get { if (instance == null) { instance = new DemoDataSource(); } return instance; } } public List<ExternalActivity> ExternalActivities { get; set; } private DemoDataSource() { this.Reset(); this.Initialize(); } public void Reset() { ExternalActivities = new List<ExternalActivity>(); } public void Initialize() { for (int i = 0; i < 1000; i++) { Guid contactId = Guid.NewGuid(); Guid externalActivityId = Guid.NewGuid(); if (i < 50) { contactId = new Guid("C4BA7D70-347B-E811-A961-000D3AE05F14"); } ExternalActivities.AddRange(new List<ExternalActivity> { new ExternalActivity() { ExternalActivityId = externalActivityId, ExternalActivityKey = i, ContactId = contactId, From = RandomString(10), To = RandomString(10), Subject= RandomString(20), Details = RandomString(100), } }); } } static Random random = new Random(); public static string RandomString(int length) { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); } } }
Na parte de código que está destacada, para os 50 primeiros, estou atribuindo um ID (C4BA7D70-347B-E811-A961-000D3AE05F14) de um contato (contact) que existe em meu Dynamics 365. Assim quando acessarmos este registro, apenas 50 registros serão exibidos.
Neste post, não irei me aprofundar como recuperar o ID de um contato no Dynamics através de uma outra chave de negócios, como poderia ser usando o atributo “ExternalActivityKey“.
Por último, a classe de inicialização (WebApiConfig.cs) dentro do App_Start:
using DemoODataV4.Models; using Microsoft.OData.Edm; using System.Web.Http; using System.Web.OData.Batch; using System.Web.OData.Builder; using System.Web.OData.Extensions; namespace DemoODataV4 { public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapODataServiceRoute("odata", null, GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)); config.EnsureInitialized(); config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); //new line } private static IEdmModel GetEdmModel() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.Namespace = "DemoODataV4"; builder.ContainerName = "DefaultContainer"; builder.EntitySet<ExternalActivity>("ExternalActivities"); var edmModel = builder.GetEdmModel(); return edmModel; } } }
Pronto a API está pronta! Vamos ao Dynamic 365!
Dynamics 365
Temos duas etapas para realizar no Dynamics, a primeira é criar o data source de nossa entidade virtual:
Escolha como data provider o OData V4 e depois informe os detalhes de sua API.
Vale lembrar aqui que se por exemplo sua API possui o seguinte endereço http://XXX/DemoODataV4Service/ExternalActivities, devemos apenas informar a http://XXX/DemoODataV4Service/, o nome do serviço será informado no momento da criação da entidade virtual!
Como o data source criado, vamos a entidade virtual:
Selecione o checkbox “Virtual Entity” e selecione o data source que criamos na etapa anterior.
Não se esqueça de informar o External Name e External Collection Name, eles devem ser os que foram utilizados na criação da API.
Já no atributo primário e faça as devidas mudanças antes de criar a entidade virtual:
Agora é a vez de informar o External Name da chave primária (new_ExternalActivityId) da entidade virtual:
Devemos criar o relacionamento (1:N) entre Contatos e External Activity:
Veja acima que o External Name (ContactId) é o mesmo nome utilizado na Model da API.
Crie os demais atributos implementados na Model, sempre lembrando de criar atributos com o mesmo tipo de dado e como External Name o mesmo nome utilizado na propriedade da Model.
Depois adicione todos os atributos no formulário e visualizações da entidade virtual para que seja possível ve-los quando acessarmos o contato. Publique e atualize o seu navegador!
Pronto! Sua entidade virtual está configurada para acessar dados externos. Abra o mesmo contato que utilizamos o seu GUID de forma fixa na API. Depois navegue até as entidades relacionadas, clique em External Acitivities:
Ao abrirmos os registros (clicando duas vezes), vemos o formulário em modo apenas leitura com os atributos já preenchidos:
Bom, isso é tudo! Espero ter ajudado!
[]’s,
Tiago