Skip to content

Commit 86e8afc

Browse files
committed
export relationships logic
1 parent 3e9f034 commit 86e8afc

File tree

4 files changed

+110
-31
lines changed

4 files changed

+110
-31
lines changed

src/Dataverse.ConfigurationMigrationTool/Dataverse.ConfigurationMigrationTool.Console/Features/Export/Commands/ExportCommand.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,19 @@ public class ExportCommand : ICommand
1010
private readonly ExportCommandOption _options;
1111
private readonly IValidator<DataSchema> _schemaValidator;
1212
private readonly IFileDataReader _fileDataReader;
13+
private readonly IDataExportService _dataExportService;
1314

1415
public ExportCommand(ILogger<ExportCommand> logger,
1516
IOptions<ExportCommandOption> options,
1617
IValidator<DataSchema> schemaValidator,
17-
IFileDataReader fileDataReader)
18+
IFileDataReader fileDataReader,
19+
IDataExportService dataExportService)
1820
{
1921
_logger = logger;
2022
_options = options.Value;
2123
_schemaValidator = schemaValidator;
2224
_fileDataReader = fileDataReader;
25+
_dataExportService = dataExportService;
2326
}
2427

2528
public async Task Execute() => await Export(_options.schema, _options.output);
@@ -42,7 +45,7 @@ private async Task Export(string schemafilepath, string outputfilepath)
4245
}
4346
_logger.LogInformation("Schema validation succeeded.");
4447

45-
48+
var entities = await _dataExportService.ExportEntitiesFromSchema(schema);
4649

4750
}
4851

Original file line numberDiff line numberDiff line change
@@ -1,63 +1,61 @@
1-
using Dataverse.ConfigurationMigrationTool.Console.Common;
2-
using Dataverse.ConfigurationMigrationTool.Console.Features.Export.Mappers;
3-
using Dataverse.ConfigurationMigrationTool.Console.Features.Shared;
1+
using Dataverse.ConfigurationMigrationTool.Console.Features.Shared;
42
using Dataverse.ConfigurationMigrationTool.Console.Features.Shared.Domain;
53
using Microsoft.Extensions.Logging;
6-
using Microsoft.PowerPlatform.Dataverse.Client;
7-
using Microsoft.Xrm.Sdk;
8-
using Microsoft.Xrm.Sdk.Metadata;
9-
using Microsoft.Xrm.Sdk.Query;
104

115
namespace Dataverse.ConfigurationMigrationTool.Console.Features.Export;
126
public interface IDataExportService
137
{
14-
Task<TaskResult> ExportToFile(DataSchema Schema, string outputfile);
8+
Task<IEnumerable<EntityImport>> ExportEntitiesFromSchema(DataSchema Schema);
159
}
1610
public class DataExportService : IDataExportService
1711
{
1812
private readonly ILogger<DataExportService> _logger;
19-
private readonly IOrganizationServiceAsync2 _organizationServiceAsync2;
2013
private readonly IMetadataService _metadataService;
21-
private static readonly IMapper<(EntityMetadata, EntitySchema, Entity), Record> _recordMapper = new DataverseRecordToRecordMapper();
14+
private readonly IDomainService _domainService;
15+
2216
public DataExportService(ILogger<DataExportService> logger,
23-
IOrganizationServiceAsync2 organizationServiceAsync2,
24-
IMetadataService metadataService)
17+
IMetadataService metadataService,
18+
IDomainService domainService)
2519
{
2620
_logger = logger;
27-
_organizationServiceAsync2 = organizationServiceAsync2;
2821
_metadataService = metadataService;
22+
_domainService = domainService;
2923
}
3024

31-
public async Task<TaskResult> ExportToFile(DataSchema Schema, string outputfile)
25+
public async Task<IEnumerable<EntityImport>> ExportEntitiesFromSchema(DataSchema Schema)
3226
{
3327
var entityImports = new Dictionary<string, EntityImport>();
3428
foreach (var entitySchema in Schema.Entity)
3529
{
3630
_logger.LogInformation("Exporting entity {entityName}", entitySchema.Displayname);
37-
38-
var exportfields = entitySchema.Fields.Field.Select(f => f.Name).ToList();
3931
var metadata = await _metadataService.GetEntity(entitySchema.Name);
40-
var query = new QueryExpression(entitySchema.Name)
41-
{
42-
ColumnSet = new ColumnSet(exportfields.ToArray()),
43-
44-
};
45-
var entityCollection = await _organizationServiceAsync2.RetrieveAll(query, page: 5000, _logger);
46-
47-
var data = entityCollection.Entities.Select(e => _recordMapper.Map((metadata, entitySchema, e))).ToList();
48-
32+
var data = await _domainService.GetRecords(metadata, entitySchema);
4933
//Add Relationships export
50-
34+
var entityRelationShips = new List<M2mrelationship>();
35+
foreach (var relationship in entitySchema.Relationships.Relationship)
36+
{
37+
if (!relationship.ManyToMany)
38+
{
39+
continue;
40+
}
41+
var relMD = metadata.ManyToManyRelationships.FirstOrDefault(r => r.IntersectEntityName == relationship.RelatedEntityName);
42+
var relationships = await _domainService.GetM2mRelationships(relMD);
43+
entityRelationShips.AddRange(relationships);
44+
45+
}
5146
entityImports[entitySchema.Name] = new EntityImport
5247
{
5348
Name = entitySchema.Name,
5449
Displayname = entitySchema.Displayname,
55-
Records = new Records { Record = data }
50+
Records = new Records { Record = data.ToList() },
51+
M2mrelationships = new M2mrelationships
52+
{
53+
M2mrelationship = entityRelationShips
54+
}
5655
};
5756

5857
}
5958
// Write To File
60-
61-
return TaskResult.Completed;
59+
return entityImports.Select(kv => kv.Value).ToList();
6260
}
6361
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Dataverse.ConfigurationMigrationTool.Console.Features.Shared.Domain;
2+
using Microsoft.Xrm.Sdk.Metadata;
3+
4+
namespace Dataverse.ConfigurationMigrationTool.Console.Features.Export;
5+
public interface IDomainService
6+
{
7+
Task<IEnumerable<Record>> GetRecords(EntityMetadata metadata, EntitySchema Schema);
8+
Task<IEnumerable<M2mrelationship>> GetM2mRelationships(ManyToManyRelationshipMetadata metadata);
9+
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using Dataverse.ConfigurationMigrationTool.Console.Common;
2+
using Dataverse.ConfigurationMigrationTool.Console.Features.Export;
3+
using Dataverse.ConfigurationMigrationTool.Console.Features.Export.Mappers;
4+
using Dataverse.ConfigurationMigrationTool.Console.Features.Shared;
5+
using Dataverse.ConfigurationMigrationTool.Console.Features.Shared.Domain;
6+
using Microsoft.Extensions.Logging;
7+
using Microsoft.PowerPlatform.Dataverse.Client;
8+
using Microsoft.Xrm.Sdk;
9+
using Microsoft.Xrm.Sdk.Metadata;
10+
using Microsoft.Xrm.Sdk.Query;
11+
12+
namespace Dataverse.ConfigurationMigrationTool.Console.Services.Dataverse;
13+
public class DataverseDomainService : IDomainService
14+
{
15+
private readonly IOrganizationServiceAsync2 _orgService;
16+
private readonly ILogger<DataverseDomainService> _logger;
17+
private static readonly IMapper<(EntityMetadata, EntitySchema, Entity), Record> _recordMapper = new DataverseRecordToRecordMapper();
18+
public DataverseDomainService(IOrganizationServiceAsync2 orgService, ILogger<DataverseDomainService> logger)
19+
{
20+
_orgService = orgService;
21+
_logger = logger;
22+
}
23+
24+
public async Task<IEnumerable<Record>> GetRecords(EntityMetadata metadata, EntitySchema Schema)
25+
{
26+
var exportfields = Schema.Fields.Field.Select(f => f.Name).ToList();
27+
if (exportfields.Count == 0)
28+
{
29+
_logger.LogWarning("No fields specified for export in schema for entity {entityName}", Schema.Name);
30+
return Enumerable.Empty<Record>();
31+
}
32+
var query = new QueryExpression(Schema.Name)
33+
{
34+
ColumnSet = new ColumnSet(exportfields.ToArray()),
35+
36+
};
37+
var entityCollection = await _orgService.RetrieveAll(query, page: 5000, _logger);
38+
39+
var data = entityCollection.Entities.Select(e => _recordMapper.Map((metadata, Schema, e))).ToList();
40+
return data;
41+
}
42+
43+
public async Task<IEnumerable<M2mrelationship>> GetM2mRelationships(ManyToManyRelationshipMetadata metadata)
44+
{
45+
var query = new QueryExpression(metadata.IntersectEntityName)
46+
{
47+
ColumnSet = new ColumnSet(true)
48+
};
49+
var entityCollection = await _orgService.RetrieveAll(query, page: 5000, _logger);
50+
51+
return entityCollection.Entities.Select(e =>
52+
{
53+
return new M2mrelationship
54+
{
55+
Sourceid = e.GetAttributeValue<Guid>(metadata.Entity1IntersectAttribute),
56+
Targetentityname = metadata.Entity2LogicalName,
57+
Targetentitynameidfield = metadata.Entity2IntersectAttribute,
58+
M2mrelationshipname = metadata.IntersectEntityName,
59+
Targetids = new Targetids
60+
{
61+
Targetid = entityCollection.Entities.Select(e => e.GetAttributeValue<Guid>(metadata.Entity2IntersectAttribute)).ToList()
62+
}
63+
};
64+
65+
}).ToList();
66+
}
67+
}

0 commit comments

Comments
 (0)