Ich verwende diese zwei Kontext für WPF und Web-API. Der Punkt ist mit EF6, ich könnte eine Überladung des Konstruktors schreiben und die Verbindungszeichenfolge für die Verwendung in einer WPF-Anwendung übergeben. Aber in EF Core muss ich die Onconfiguring-Methode überschreiben, so dass es nicht mehr in einem Web.Api.Core verwendet werden kann. Weil ich die Abhängigkeitsinjektion verwenden möchte, die in startup.cs registriert wird.
services.AddDbContext<SamuraiContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SamuraiConnection")));
Wie kann ich einen Kontext erstellen, der in beiden Fällen verwendet werden kann?
Danke in andvance.
Kontext für 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);
}
}
Dies ist mein Kontext für 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);
}
Sie können immer noch einen zweiten Konstruktor für Ihre Verbindungszeichenfolge haben:
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);
}