在完整的 .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
}
}
我想在 .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]))
我找到了这个
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
}
}