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

问题描述 投票:0回答:2

我想在.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:“未找到与成员匹配的数据。

错误:RegisterType(Invoke.Constructor(Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1 [Microsoft.EntityFrameworkCore.DbContext]))

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

c# prism unity-container .net-framework-version ef-core-2.2
2个回答
0
投票

我认为您需要通过DbContextOptions<CrossSettingContext>

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

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.