Зарегистрируйте EF Core в Prism полностью. NET Framework - PullRequest
0 голосов
/ 05 января 2020

Я хочу использовать EF.Core 2.2.6 в. Net Framework (4.6.2) проекте. Я создал отдельный проект для базы данных.

Я хочу зарегистрировать DbContext в основном проекте, используя внедрение зависимостей через инфраструктуру Prism (Unity).

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. Конструктор (Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`1 [Microsoft.EntityFrameworkCore.DbContext]))

Я нашел этот вопрос -> но мне нужен EF Core 2.2.6, а не Entity Framework 6.0

1 Ответ

1 голос
/ 05 января 2020

Ответ от Хаукингера частично верен, но в нем отсутствует довольно много важной информации.

Что вы хотите сделать, например:

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

Однако вам ничего не нужно Контейнер Specifi c ВСЕ здесь. Все, что вам действительно нужно, это:

containerRegistry.RegisterInstance(optionsBuilder.Options);

На самом деле вам не нужно регистрировать CrossSettingContext, если вы хотите новый экземпляр каждый раз, когда он разрешается. Хотя вы можете сделать следующее, если вам нужен синглтон:

containerRegistry.RegisterSingleton<CrossSettingContext>();

Когда вы хотите использовать его, вы можете просто вставить контекст в вашу ViewModel / Services, например:

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