在完整的 .NET Framework 中在 Prism 中注册 EF Core

Register EF Core in Prism in full .NET Framework

我想在 .Net Framework (4.6.2) 项目中使用 EF.Core 2.2.6。我为数据库创建了一个单独的项目。

我想在 Prism 框架 (Unity) 上使用依赖注入在主项目中注册 DbContext

var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
optionsBuilder.UseSqlite(@"Data Source=CustomerDB.db");
containerRegistry.GetContainer().RegisterType<DbContext, CrossSettingContext>();
containerRegistry.GetContainer().RegisterType<DbContext>(new InjectionConstructor(optionsBuilder));

数据库上下文:

public  class CrossSettingContext : DbContext
{
    private static Action<DbContextOptionsBuilder> onConfigure;
    #pragma warning restore 649

    public CrossSettingContext(DbContextOptions<CrossSettingContext> options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.EnableSensitiveDataLogging(true);
        onConfigure?.Invoke(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Setting>().Map();
    }
}

我得到以下异常。问题是我是否使用正确的方法注册 EF Core。

System.InvalidOperationException: "No member matching data has been found.

Error in: RegisterType(Invoke.Constructor(Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1[Microsoft.EntityFrameworkCore.DbContext]))

我找到了这个 -> 但我需要 EF Core 2.2.6 而不是 Entity Framework 6.0

Haukinger 的回答部分正确,但遗漏了相当多的重要信息。

您想做的事情如下:

var optionsBuilder = new DbContextOptionsBuilder<CrossSettingContext>();
optionsBuilder.UseSqlite( @"Data Source=CustomerDB.db" );

但是,您在这里根本不需要任何特定于容器的东西。您真正需要的是:

containerRegistry.RegisterInstance(optionsBuilder.Options);

如果每次解析时都需要一个新实例,则实际上不需要注册 CrossSettingContext。如果你想要一个单身人士,你可以执行以下操作:

containerRegistry.RegisterSingleton<CrossSettingContext>();

当你想使用它时,你可以在你的 ViewModel/Services 中注入上下文,例如:

public class ViewAViewModel
{
    public ViewAViewModel(CrossSettingContext context)
    {
        // Do Stuff
    }
}