CSharp · Console
// Entity Framework Extensions
// Doc: https://entityframework-extensions.net/pre-bulk-save-changes
// @nuget: Microsoft.EntityFrameworkCore.SqlServer
// @nuget: Z.EntityFramework.Extensions.EFCore
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using Z.EntityFramework.Extensions;
public class Program
{
public static void Main()
{
using (var context = new EntityContext())
{
context.Database.EnsureCreated();
}
GenerateData();
EntityFrameworkManager.PreBulkSaveChanges = ctx =>
{
var modifiedEntities = ctx.ChangeTracker.Entries().ToList();
foreach (var change in modifiedEntities)
{
if (change.State == EntityState.Added)
{
change.CurrentValues["CreatedDate"] = DateTime.Now;
}
else if (change.State == EntityState.Modified)
{
change.CurrentValues["ModifiedDate"] = DateTime.Now;
}
}
};
using (var context = new EntityContext())
{
var list = context.Customers.ToList();
context.Customers.RemoveRange(list.Take(2));
list.ForEach(x => { x.Name += "_Updated"; x.IsActive = false; });
var newCustomers = new List<Customer>();
newCustomers.Add(new Customer() { Name ="Customer_E", IsActive = true});
newCustomers.Add(new Customer() { Name ="Customer_F", IsActive = true});
context.Customers.AddRange(newCustomers);
context.BulkSaveChanges();
}
using (var context = new EntityContext())
{
FiddleHelper.WriteTable("After_BulkSaveChanges", context.Customers.ToList());
}
}
public static void GenerateData()
{
using (var context = new EntityContext())
{
context.Customers.Add(new Customer() { Name ="Customer_A", IsActive = true });
context.Customers.Add(new Customer() { Name ="Customer_B", IsActive = true });
context.Customers.Add(new Customer() { Name ="Customer_C", IsActive = true });
context.Customers.Add(new Customer() { Name ="Customer_D", IsActive = true });
context.BulkSaveChanges();
}
using (var context = new EntityContext())
{
FiddleHelper.WriteTable("Before_BulkSaveChanges", context.Customers.ToList());
}
}
public class EntityContext : DbContext
{
public EntityContext()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(new SqlConnection(FiddleHelper.GetConnectionStringSqlServer()));
base.OnConfiguring(optionsBuilder);
}
public DbSet<Customer> Customers { get; set; }
}
public class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Boolean IsActive { get; set; }
public DateTime? CreatedDate { get; set; }
public DateTime? ModifiedDate { get; set; }
}
}