当我使用普通/经典DBContext
实现时,我的应用程序运行良好,但当我尝试DbContextFactory
时,_contextFactory.CreateDbContext()
总是失败并出现“null”异常。我遗漏了什么?
我的App.xaml.cs
(使用DBContext
时,此文件不需要更改):
private void ConfigureServices(IServiceCollection services)
{
string defaultConnection = Settings.Default.DefaultConnection;
services.AddDbContextFactory<MyDbContext>(options => options.UseMySql(defaultConnection, ServerVersion.AutoDetect(defaultConnection)));
services.AddTransient(typeof(MainWindow));
}
MyDbContext.cs
文件(不需要更改,因为它似乎已经符合DbContextFactory
构造函数的要求):
public class MyDbContext : DbContext
{
public MyDbContext (DbContextOptions<MyDbContext> options)
: base(options)
{
}
// DbSets
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
string defaultConnection = Settings.Default.DefaultConnection;
var options = new DbContextOptionsBuilder<MyDbContext>()
.UseMySql(defaultConnection, ServerVersion.AutoDetect(defaultConnection))
.Options;
}
optionsBuilder.UseLazyLoadingProxies();
// To be disabled in production
optionsBuilder.LogTo(Console.WriteLine, LogLevel.Information);
optionsBuilder.EnableSensitiveDataLogging();
optionsBuilder.EnableDetailedErrors();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Table building logic for EF code-first
}
}
MainWindow.xaml.cs
档案:
public partial class MainWindow : Window
{
private readonly IDbContextFactory<MyDbContext> _contextFactory;
private SomeVieModel _someVieModel;
public MainWindow()
{
InitializeComponent();
var _context = _contextFactory.CreateDbContext(); // Throws 'null' exception
// Probably should be instantiating a new DbContext
// in the VM itself, instead of passing it on?
_someVieModel = new SomeVieModel(_context);
}
}
我检查了很多Blazor的例子,因为缺少WPF的例子,我觉得我缺少了一些非常简单的东西,一些DbContextFactory
对象示例化的一行?比如this example-IDbContextFactory<MyDbContext> contextFactory
对象来自哪里,它在哪里被示例化?谢谢!
1条答案
按热度按时间q1qsirdb1#
我想我已经解决了,虽然我相信你们中的一些人会指出我的错误:)
我刚刚意识到,我已经为数据库迁移创建了自己的
DbContextFactory
类,因为否则EF Core无法单独通过项目的DbContext
类连接到数据库。我已经注解掉了
App.xaml.cs
中的代码,并通过我自己的类而不是IDbContextFactory
接口初始化了DbContextFactory
:并在一个名为
CreateDbContext()
的视图模型中: