Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project>
<PropertyGroup>
<NoWarn>CS1591;CA1416;CS8632</NoWarn>
<Version>15.3.0</Version>
<Version>15.4.0</Version>
<AssemblyVersion>1.0.0</AssemblyVersion>
<ContinuousIntegrationBuild>false</ContinuousIntegrationBuild>
<CheckEolTargetFramework>false</CheckEolTargetFramework>
Expand Down
64 changes: 64 additions & 0 deletions src/EfLocalDb/DbContextExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
namespace EfLocalDb;

public static partial class DbContextExtensions
{
internal static IEnumerable<object> ExpandEnumerable(IEnumerable<object> entities, IReadOnlyList<IEntityType> entityTypes)
{
foreach (var entity in entities)
{
if (entity is IEnumerable enumerable)
{
var entityType = entity.GetType();
if (entityTypes.Any(_ => _.ClrType != entityType))
{
foreach (var nested in enumerable)
{
yield return nested;
}

continue;
}
}

yield return entity;
}
}

public static Task AddData<TDbContext>(this TDbContext context, IEnumerable<object> entities)
where TDbContext : DbContext =>
context.AddData(entities, context.Model.GetEntityTypes().ToArray());

public static Task AddData<TDbContext>(this TDbContext context, params object[] entities)
where TDbContext : DbContext =>
context.AddData((IEnumerable<object>) entities);

internal static Task AddData<TDbContext>(this TDbContext context, IEnumerable<object> entities, IReadOnlyList<IEntityType> entityTypes)
where TDbContext : DbContext
{
foreach (var entity in ExpandEnumerable(entities, entityTypes))
{
context.Add(entity);
}

return context.SaveChangesAsync();
}

public static Task RemoveData<TDbContext>(this TDbContext context, IEnumerable<object> entities)
where TDbContext : DbContext =>
context.RemoveData(entities, context.Model.GetEntityTypes().ToArray());

public static Task RemoveData<TDbContext>(this TDbContext context, params object[] entities)
where TDbContext : DbContext =>
context.RemoveData((IEnumerable<object>) entities);

internal static Task RemoveData<TDbContext>(this TDbContext context, IEnumerable<object> entities, IReadOnlyList<IEntityType> entityTypes)
where TDbContext : DbContext
{
foreach (var entity in ExpandEnumerable(entities, entityTypes))
{
context.Remove(entity);
}

return context.SaveChangesAsync();
}
}
23 changes: 2 additions & 21 deletions src/EfLocalDb/SqlDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,25 +141,6 @@ public async Task Delete()
public DbSet<T> Set<T>()
where T : class => NoTrackingContext.Set<T>();

IEnumerable<object> ExpandEnumerable(IEnumerable<object> entities)
{
foreach (var entity in entities)
{
if (entity is IEnumerable enumerable)
{
var entityType = entity.GetType();
if (instance.EntityTypes.Any(_ => _.ClrType != entityType))
{
foreach (var nested in enumerable)
{
yield return nested;
}

continue;
}
}

yield return entity;
}
}
IEnumerable<object> ExpandEnumerable(IEnumerable<object> entities) =>
DbContextExtensions.ExpandEnumerable(entities, instance.EntityTypes);
}
18 changes: 5 additions & 13 deletions src/EfLocalDb/SqlDatabase_Add.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,16 @@

public partial class SqlDatabase<TDbContext>
{
public Task AddData(IEnumerable<object> entities) => Add(entities, Context);
public Task AddData(IEnumerable<object> entities) =>
Context.AddData(entities, instance.EntityTypes);

Task Add(IEnumerable<object> entities, TDbContext context)
{
foreach (var entity in ExpandEnumerable(entities))
{
context.Add(entity);
}

return context.SaveChangesAsync();
}

public Task AddData(params object[] entities) => AddData((IEnumerable<object>) entities);
public Task AddData(params object[] entities) =>
AddData((IEnumerable<object>) entities);

public async Task AddDataUntracked(IEnumerable<object> entities)
{
await using var context = NewDbContext();
await Add(entities, context);
await context.AddData(entities, instance.EntityTypes);
}

public Task AddDataUntracked(params object[] entities) => AddDataUntracked((IEnumerable<object>) entities);
Expand Down
18 changes: 5 additions & 13 deletions src/EfLocalDb/SqlDatabase_Remove.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,16 @@

public partial class SqlDatabase<TDbContext>
{
public Task RemoveData(IEnumerable<object> entities) => Remove(entities, Context);
public Task RemoveData(IEnumerable<object> entities) =>
Context.RemoveData(entities, instance.EntityTypes);

Task Remove(IEnumerable<object> entities, TDbContext context)
{
foreach (var entity in ExpandEnumerable(entities))
{
context.Remove(entity);
}

return context.SaveChangesAsync();
}

public Task RemoveData(params object[] entities) => RemoveData((IEnumerable<object>) entities);
public Task RemoveData(params object[] entities) =>
RemoveData((IEnumerable<object>) entities);

public async Task RemoveDataUntracked(IEnumerable<object> entities)
{
await using var context = NewDbContext();
await Remove(entities, context);
await context.RemoveData(entities, instance.EntityTypes);
}

public Task RemoveDataUntracked(params object[] entities) => RemoveDataUntracked((IEnumerable<object>) entities);
Expand Down