Реализация миграции для справочника Страна
Для передачи данных сущности из ELMA3/4 в ELMA365 в глобальном модуле необходимо определить класс маппинга. Пример для справочника Страна (с дополнительными полями в конфигурации ELMA3/4). В ELMA365 создаем Приложение как предложено здесь:
Элемент обмена данными (маппинг):
using ITino.ELMA.E365.Common.Models;
using Newtonsoft.Json;
namespace E365
{
public class CountryDataItem : BaseDataItem
{
public override string Path => "app/_clients/rmgCountry";
[JsonProperty(PropertyName = "__name")]
public string Name { get; set; }
public string Code { get; set; }
public string ShortName { get; set; }
public long? CountryCode { get; set; }
public string EnglishName { get; set; }
public string Alpha2 { get; set; }
public string Alpha3 { get; set; }
public string Location { get; set; }
public string LocationPrecise { get; set; }
}
}
Лисенер для регистрации изменений элемента сущности:
using EleWise.ELMA.Runtime.NH.Listeners;
using EleWise.ELMA.ComponentModel;
using NHibernate.Event;
using ITino.ELMA.E365.Common.Components;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using ITino.ELMA.E365.Common.Managers;
using EleWise.ELMA;
using ITino.ELMA.CRM.Models;
namespace E365
{
[Component]
public class CountryListener : PostFlushEventListener
{
public override void OnPostInsert(PostInsertEvent @event)
{
SyncItem(@event.Entity as ICOCountry, true);
}
/// <inheritdoc />
public override void OnPostUpdate(PostUpdateEvent @event)
{
SyncItem(@event.Entity as ICOCountry, true);
}
public static Pair<IBaseDataItem, IEntity> SyncItem(ICOCountry item, bool syncLink = false)
{
var data = new CountryDataItem();
if (item == null)
return new Pair<IBaseDataItem, IEntity>(data, item);
data.Uid = item.Uid;
data.Name = item.Name;
data.Code = item.Code;
data.ShortName = item.ShortName;
data.CountryCode = item.CountryCode;
data.EnglishName = item.EnglishName;
data.Alpha2 = item.Alpha2;
data.Alpha3 = item.Alpha3;
data.Location = item.Location;
data.LocationPrecise = item.LocationPrecise;
E365DataItemManager.Instance.PushItem(typeof(CountryDataItem), item.Uid, data, item, SR.T("Страна: {0}", item.Name));
return new Pair<IBaseDataItem, IEntity>(data, item);
}
}
}
Обработчик события полной синхронизации справочника. Так же используется для вызова принудительной синхронизации всех данных из хелпера:
using System;
using System.Linq;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Model.Services;
using ITino.ELMA.E365.Common.Components;
using EleWise.ELMA.Model.Managers;
using ITino.ELMA.CRM.Models;
namespace E365
{
[Component]
public class CountrySyncHandler : ForceSyncHandler
{
public override Type Type => InterfaceActivator.TypeOf<ICOCountry>();
public override void Process()
{
EntityManager<ICOCountry>.Instance.FindAll().ToList().ForEach(x => CountryListener.SyncItem(x));
}
}
}
ICOCountry является расширением модульной сущности ICountry