簡體   English   中英

如何編寫可在WPF和Web.Api.Core中使用的EF Core 2.0 DbContext

[英]How to write a EF Core 2.0 DbContext which can be used in WPF and Web.Api.Core

我正在為WPF和Web-Api使用這兩個上下文。 關鍵在於EF6,我可以編寫一個構造函數的重載,並將連接字符串傳遞給它,以供WPF應用程序使用。 但是在EF Core中,我必須重寫Onconfiguring方法,這樣就無法在Web.Api.Core中使用它。 因為我想使用在startup.cs中注冊的依賴項注入功能。

services.AddDbContext<SamuraiContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SamuraiConnection")));

如何創建可以在兩種情況下使用的上下文?

非常感謝。

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);
    }
}

這是我對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);
        }

您仍然可以為連接字符串使用第二個構造函數:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM