无法为 Net Core 3.1 WPF 应用程序创建类型为“DbContext”的对象

Posted

技术标签:

【中文标题】无法为 Net Core 3.1 WPF 应用程序创建类型为“DbContext”的对象【英文标题】:Unable to create an object of type 'DbContext' for Net Core 3.1 WPF app 【发布时间】:2021-03-20 05:22:06 【问题描述】:

我的 SqlLite 数据库迁移引发错误:

Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type 'ProductDbContext'.

---> System.MissingMethodException: No parameterless constructor defined for type 'WpfApp1.Data.ProductDbContext'.

这是我的 DbContext

public class ProductDbContext : DbContext

    #region Constructor
    public ProductDbContext(DbContextOptions<ProductDbContext> options) : base(options)
    
        Database.EnsureCreated();
    

    #endregion
    #region Public properties
    public DbSet<Product> Products  get; set; 
    public DbSet<Category> Types  get; set; 
    #endregion
    #region Overridden methods
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.ApplyConfiguration(new ProductDbConfig());
        modelBuilder.ApplyConfiguration(new CategoryDbConfig());
        modelBuilder.Entity<Product>().HasData(GetProducts());
        base.OnModelCreating(modelBuilder);
    

    private Product[] GetProducts()
    
        // create seed data
    

我有一个 App.xaml.cs 我在其中进行配置

public partial class App : Application

    #region Private members
    private readonly ServiceProvider serviceProvider;
    #endregion

    #region Constructor
    public App()
    
        ServiceCollection services = new ServiceCollection();

        services.AddDbContext<ProductDbContext>(options =>
        
            options.UseSqlite("Data Source = Product.db");
        );

        services.AddSingleton<MainWindow>();
        serviceProvider = services.BuildServiceProvider();
    
    #endregion


    #region Event Handlers
    private void OnStartup(object s, StartupEventArgs e)
    
        var mainWindow = serviceProvider.GetService<MainWindow>();
        mainWindow.Show();
    
    #endregion

我尝试在我的 dbContext 中添加一个无参数构造函数。没用。 是什么导致了这个错误?以及如何解决这个问题? 任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

在我的 Xamarin.Forms 应用程序中,我在 DbContext 类中以这种方式使用它

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        // Specify that we will use sqlite and the path of the database here
        var options = optionsBuilder
            .UseSqlite($"Data Source=SQLiteDatabasePath");

        base.OnConfiguring(options);
    

== 编辑 ==

我的基类中所有服务的单例构造:

        private static ETabberDb _DbContext;

        protected ETabberDb ETabberDbContext
        
            get
            
                if (_DbContext == null)
                
                    var dbPath = DeviceService.GetSQLiteDatabasePath();

                    if (!File.Exists(dbPath))
                    
                        File.Create(dbPath).Dispose();
                        new SQLite.SQLiteConnection(dbPath).Dispose();
                    

                    ETabberDb.SQLiteDatabasePath = dbPath;

                    _DbContext = new ETabberDb();
                

                return _DbContext;
            
        

【讨论】:

这是否意味着删除服务。我的 App.xaml.cs 的 App() 方法中的“AddDbContext...”代码? 是的,我认为您应该删除该代码。 但是您需要对 DbContext 进行某种实例化。我在服务的基类中使用单例。 三思而后行。很可能是我的代码有缺陷。毕竟我不需要第一个声明。让我试试。一分钟。 代码正确。你也需要 OnConfigure

以上是关于无法为 Net Core 3.1 WPF 应用程序创建类型为“DbContext”的对象的主要内容,如果未能解决你的问题,请参考以下文章

在 .Net Core 3.1 的 2.0 版中找不到 MahApps ToggleSwitch

WPF .NET Core 3.1 应用程序发布单个文件(发布)失败

NET Core 3.1 WinForms Designer 与 WPF 用户控件不兼容

WPF .Net Core 3.1 依赖注入/服务参考问题

.Net Core 3.1 Process.Start("www.website.com") 在 WPF 中不起作用

Microsoft.ReportViewer.WinForms.V15 与 .NET Core 3.1 不兼容 - 如何在 WPF Core 中显示 RDLC?