Files
EonaCat.Sync/EonaCat.Sync/EntityFramework/EFCoreSynchronizer.cs
T
2026-06-29 07:25:42 +02:00

95 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EonaCat.Sync.Models;
namespace EonaCat.Sync.EntityFramework
{
/// <summary>
/// Entity Framework Core support (requires Microsoft.EntityFrameworkCore NuGet package).
/// Provides extension methods for DbContext instances.
/// </summary>
public class EFCoreSynchronizer
{
public string Name => "Entity Framework Core Synchronizer";
public string Description => "Requires: Install-Package Microsoft.EntityFrameworkCore";
/// <summary>
/// Helper to check if EF Core is available.
/// </summary>
public static bool IsAvailable()
{
try
{
var efCoreType = Type.GetType("Microsoft.EntityFrameworkCore.DbContext, Microsoft.EntityFrameworkCore");
return efCoreType != null;
}
catch
{
return false;
}
}
/// <summary>
/// Gets change information from Entity Framework Core DbContext.
/// This is a wrapper that uses reflection to avoid hard EF Core dependency.
/// </summary>
public static async Task<SyncResult> SyncDbContextAsync(object sourceContext, object targetContext, string[] entityNames = null)
{
if (!IsAvailable())
{
return new SyncResult
{
Success = false,
Errors = new List<string> {
"Entity Framework Core is not installed. " +
"Install it with: Install-Package Microsoft.EntityFrameworkCore"
}
};
}
var result = new SyncResult();
try
{
// Use reflection to call SaveChangesAsync if available
var method = targetContext?.GetType().GetMethod("SaveChangesAsync", Type.EmptyTypes);
if (method != null)
{
var methodResult = method.Invoke(targetContext, null);
// For now, just mark as success since reflection makes this complex
result.Success = true;
result.ChangesApplied = 1;
}
else
{
result.Success = false;
result.Errors.Add("DbContext SaveChangesAsync method not found");
}
}
catch (Exception ex)
{
result.Success = false;
result.Errors.Add($"EF Core sync failed: {ex.Message}");
}
return await Task.FromResult(result);
}
}
/// <summary>
/// Extension methods for DbContext (available when EF Core is installed).
/// </summary>
public static class EFCoreSyncExtensions
{
/// <summary>
/// Generic sync extension for DbContext.
/// Note: This will only work when Microsoft.EntityFrameworkCore is installed.
/// </summary>
public static async Task<SyncResult> SyncWithAsync(this object sourceContext, object targetContext)
{
return await EFCoreSynchronizer.SyncDbContextAsync(sourceContext, targetContext);
}
}
}