using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Internal;
namespace EfDataAdapter
{
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
public static DbContextOptions Options = GetOptions();
static ApplicationDbContextFactory() {
DbContextPool = new DbContextPool<ApplicationDbContext>(GetOptions());
}
private static DbContextPool<ApplicationDbContext> DbContextPool { get; }
public static DbContextOptions GetOptions()
{
var assemblyName = typeof(ApplicationDbContextFactory).Assembly.GetName().Name;
var settings = new EfSettings();
var connectionString = settings.ConnectionString;
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(connectionString, b => b.MigrationsAssembly(assemblyName));
return optionsBuilder.Options;
}
public ApplicationDbContext CreateDbContext(string[] args)
{
return DbContextPool.Rent();
}
public void ReturnDbContext(ApplicationDbContext applicationDbContext)
{
DbContextPool.Return(applicationDbContext);
}
}
}
using System;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace EfDataAdapter.UnitOfWork
{
public class UnitOfWork : IUnitOfWork, IDisposable
{
private ApplicationDbContext _dbContext { get; set; }
private ApplicationDbContextFactory _dbContextFactory;
public UnitOfWork(DbContext context)
{
_dbContextFactory = new ApplicationDbContextFactory();
_dbContext = (ApplicationDbContext)context;
}
public UnitOfWork()
{
_dbContextFactory = new ApplicationDbContextFactory();
CreateDbContext();
}
private void CreateDbContext()
{
_dbContext = _dbContextFactory.GetDbContext();
}
public void Commit()
{
_dbContext.SaveChanges();
}
public async Task<int> CommitAsync()
{
return await _dbContext.SaveChangesAsync();
}
public DbContext GetContext()
{
return _dbContext;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_dbContext != null)
{
//_dbContext.Dispose();
_dbContextFactory.ReturnDbContext(_dbContext);
}
}
}
}
}
221100cookie-checkC# EF core Connection Pooling