Estoy usando estos dos contextos para WPF y Web-Api. El punto es con EF6, podría escribir una sobrecarga del constructor y pasarle la cadena de conexión para su uso en una aplicación WPF. Pero en EF Core tengo que anular el método Onconfiguring, de esta manera ya no se puede utilizar en un Web.Api.Core. Porque quiero usar la función de inyección de dependencia que está registrada en startup.cs.
services.AddDbContext<SamuraiContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SamuraiConnection")));
¿Cómo puedo crear un contexto que pueda usarse en ambos casos?
Thx en andvance.
Contexto para WPF:
public class SamuraiContext:DbContext
{
public static readonly LoggerFactory MyConsoleLoggerFactory
= new LoggerFactory(new[] {
new ConsoleLoggerProvider((category, level)
=> category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information, true) });
public DbSet<Samurai> Samurais { get; set; }
public DbSet<Quote> Quotes { get; set; }
public DbSet<Battle> Battles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionString = ConfigurationManager.ConnectionStrings["WPFDatabase"].ToString();
optionsBuilder
.UseLoggerFactory(MyConsoleLoggerFactory)
.EnableSensitiveDataLogging(true)
.UseSqlServer(connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SamuraiBattle>()
.HasKey(s => new { s.SamuraiId, s.BattleId });
base.OnModelCreating(modelBuilder);
}
}
Este es mi contexto para Web.Api:
public SamuraiContext(DbContextOptions<SamuraiContext> options)
: base(options)
{ }
public DbSet<SamuraiApp.Domain.Samurai> Samurais { get; set; }
public DbSet<SamuraiApp.Domain.Quote> Quotes { get; set; }
public DbSet<SamuraiApp.Domain.Battle> Battles { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SamuraiBattle>()
.HasKey(s => new { s.BattleId, s.SamuraiId });
base.OnModelCreating(modelBuilder);
}
Aún puedes tener un segundo constructor para tu cadena de conexión:
private readonly string connectionString = null;
public SamuraiContext(DbContextOptions<SamuraiContext> options)
: base(options)
{
}
public SamuraiContext(string connectionString)
{
this.connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if(this.connectionString != null)
optionsBuilder
.UseLoggerFactory(MyConsoleLoggerFactory)
.EnableSensitiveDataLogging(true)
.UseSqlServer(this.connectionString);
}