کار با چندین نوع بانک اطلاعاتی متفاوت در Entity Framework Core
نویسنده: وحید نصیری
تاریخ: ۱۳۹۷/۱۲/۲۷ ۱۹:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class SQLiteDbContext : DbContext, IUnitOfWork
{
public SQLiteDbContext(DbContextOptions options) : base(options)
{ }
public virtual DbSet<User> Users { set; get; } namespace EFCoreMultipleDb.DataLayer.SQLite.Context
{
public class SQLiteDbContextFactory : IDesignTimeDbContextFactory<SQLiteDbContext>
{
public SQLiteDbContext CreateDbContext(string[] args)
{
var basePath = Directory.GetCurrentDirectory();
Console.WriteLine($"Using `{basePath}` as the BasePath");
var configuration = new ConfigurationBuilder()
.SetBasePath(basePath)
.AddJsonFile("appsettings.json")
.Build();
var builder = new DbContextOptionsBuilder<SQLiteDbContext>();
var connectionString = configuration.GetConnectionString("SqliteConnection")
.Replace("|DataDirectory|", Path.Combine(basePath, "wwwroot", "app_data"));
builder.UseSqlite(connectionString);
return new SQLiteDbContext(builder.Options);
}
}
} {
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"SqlServerConnection": "Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog=ASPNETCoreSqlDB;AttachDbFilename=|DataDirectory|\\ASPNETCoreSqlDB.mdf;Integrated Security=True;MultipleActiveResultSets=True;",
"SqliteConnection": "Data Source=|DataDirectory|\\ASPNETCoreSqliteDB.sqlite",
"InUseKey": "SqliteConnection"
}
} var connectionStringKey = Configuration.GetConnectionString("InUseKey");
var connectionString = Configuration.GetConnectionString(connectionStringKey)
.Replace("|DataDirectory|", Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "app_data")); For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c_%%a_%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME: =0%") do (set mytime=%%a%%b)
dotnet build
dotnet ef migrations --startup-project ../EFCoreMultipleDb.Web/ add V%mydate%_%mytime% --context SQLiteDbContext dotnet build dotnet ef --startup-project ../EFCoreMultipleDb.Web/ database update --context SQLServerDbContext
namespace EFCoreMultipleDb.Web
{
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
applyPendingMigrations(app);
// ...
}
private static void applyPendingMigrations(IApplicationBuilder app)
{
var scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
using (var scope = scopeFactory.CreateScope())
{
var uow = scope.ServiceProvider.GetService<IUnitOfWork>();
uow.Migrate();
}
}
}
} namespace EFCoreMultipleDb.DataLayer.SQLite.Context
{
public class SQLiteDbContext : DbContext, IUnitOfWork
{
// ...
public void Migrate()
{
this.Database.Migrate();
}
}
} namespace EFCoreMultipleDb.Web
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IUsersService, UsersService>();
var connectionStringKey = Configuration.GetConnectionString("InUseKey");
var connectionString = Configuration.GetConnectionString(connectionStringKey)
.Replace("|DataDirectory|", Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "app_data"));
switch (connectionStringKey)
{
case "SqlServerConnection":
services.AddScoped<IUnitOfWork, SQLServerDbContext>();
services.AddDbContext<SQLServerDbContext>(options =>
{
options.UseSqlServer(
connectionString,
dbOptions =>
{
var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds;
dbOptions.CommandTimeout(minutes);
dbOptions.EnableRetryOnFailure();
});
});
break;
case "SqliteConnection":
services.AddScoped<IUnitOfWork, SQLiteDbContext>();
services.AddDbContext<SQLiteDbContext>(options =>
{
options.UseSqlite(
connectionString,
dbOptions =>
{
var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds;
dbOptions.CommandTimeout(minutes);
});
});
break;
default:
throw new NotImplementedException($"`{connectionStringKey}` is not defined in `appsettings.json` file.");
}
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
{
"ConnectionStrings": {
// …
"InUseKey": "SqlServerConnection"
}
}
namespace EFCoreMultipleDb.Services
{
public interface IUsersService
{
Task<User> FindUserAsync(int userId);
}
public class UsersService : IUsersService
{
private readonly IUnitOfWork _uow;
private readonly DbSet<User> _users;
public UsersService(IUnitOfWork uow)
{
_uow = uow;
_users = _uow.Set<User>();
}
public Task<User> FindUserAsync(int userId)
{
return _users.FindAsync(userId);
}
}
}