RSCG – DynamicsMapper
| name | DynamicsMapper |
| nuget | https://www.nuget.org/packages/YC.DynamicsMapper/ |
| link | https://github.com/YonatanCohavi/DynamicsMapper/ |
| author | Yonatan Cohavi |
Mapper for Dataverse client – generates also column names from properties
This is how you can use DynamicsMapper .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.PowerPlatform.Dataverse.Client" Version="1.1.14" />
<PackageReference Include="YC.DynamicsMapper" Version="1.0.8" />
</ItemGroup>
</Project>
The code that you will use is
using NextGenMapperDemo; var pm = new PersonMapper(); Console.WriteLine(pm.Entityname);
using DynamicsMapper.Abstractions;
namespace NextGenMapperDemo;
[CrmEntity("person")]
public class Person
{
[CrmField("personid",Mapping = MappingType.PrimaryId)]
public Guid ID { get; set; }
[CrmField("name")]
public string? Name { get; set; }
}
The code that is generated is
// <auto-generated />
#nullable enable
using Microsoft.Xrm.Sdk;
using System.Linq;
namespace DynamicsMapper.Extension
{
public static class EntityExtension
{
public static Entity? GetAliasedEntity(this Entity entity,string alias)
{
var attributes = entity.Attributes.Where(e => e.Key.StartsWith(alias)).ToArray();
if (!attributes.Any())
return null;
var aliasEntity = new Entity();
foreach (var attribute in attributes)
{
if (!(attribute.Value is AliasedValue aliasedValued))
continue;
if (string.IsNullOrEmpty(aliasEntity.LogicalName))
aliasEntity.LogicalName = aliasedValued.EntityLogicalName;
aliasEntity[aliasedValued.AttributeLogicalName] = aliasedValued.Value;
}
return aliasEntity;
}
}
}
// <auto-generated />
#nullable enable
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
namespace DynamicsMapper.Mappers
{
public interface IEntityMapper<T>
{
public string Entityname { get; }
public ColumnSet Columns { get; }
public T Map(Entity entity);
public T? Map(Entity entity,string alias);
public Entity Map(T model);
}
}
// <auto-generated />
#nullable enable
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using DynamicsMapper.Extension;
using DynamicsMapper.Mappers;
using System;
namespace NextGenMapperDemo
{
public class PersonMapper : IEntityMapper<Person>
{
private static readonly string[] columns = new[]
{
"personid",
"name"
};
public ColumnSet Columns => new ColumnSet(columns);
private const string entityname = "person";
public string Entityname => entityname;
public Entity Map(Person person)
{
var entity = new Entity(entityname);
entity.Id = person.ID;
entity["name"] = person.Name;
return entity;
}
public Person? Map(Entity entity,string alias) => InternalMap(entity,alias);
public Person Map(Entity entity) => InternalMap(entity)!;
private static Person? InternalMap(Entity source,string? alias = null)
{
Entity? entity;
if (string.IsNullOrEmpty(alias))
{
entity = source;
}
else
{
entity = source.GetAliasedEntity(alias);
if (entity is null)
return null;
}
if (entity?.LogicalName != entityname)
throw new ArgumentException($"entity LogicalName expected to be {entityname} recived: {entity?.LogicalName}","entity");
var person = new Person();
person.ID = entity.GetAttributeValue<Guid>("personid");
person.Name = entity.GetAttributeValue<string?>("name");
return person;
}
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/DynamicsMapper
Leave a Reply