【问题标题】:C# Datacontext in class library类库中的 C# 数据上下文
【发布时间】:2020-09-19 01:40:26
【问题描述】:

我认为将我的数据库类从 NET.Core 项目移到类库中会很好。

我有一个名为 ApiRegistrationDataContext 的类,继承自 DbContext 和一个类 ApiRegistrationSqliteDataContext,继承自 ApiRegistrationDataContext

在 ASP.Core 项目中,我有一些关于文件 Startup.cs 和服务中的数据库类的行。我将通过Add-Migration SomeName -Context ApiRegistrationSqliteDataContext -OutputDir Migrations\ApiRegistrationSqliteMigrations 创建迁移。

现在我将这些类移到一个类库中,并从 ASP.Core 项目中删除了所有连接。但是现在我无法创建新的迁移(我能够将旧迁移从 ASP.Core 项目移动到类库)。

错误信息显示

Unable to create an object of type 'ContactDataContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

老实说,这根本没有帮助。 为什么它在 ASP.Core 项目中有效,但在我的类库中不再有效?

【问题讨论】:

  • 您是否已将原始项目具有的所有 NuGet 包(处理 EF)添加到类库中?
  • 你是从包管理器控制台调用命令吗?

标签: c# entity-framework asp.net-core migration class-library


【解决方案1】:

作为docs 状态:

某些 EF Core 工具命令(例如,迁移命令)需要在设计时创建派生的 DbContext 实例,以便收集有关应用程序实体类型以及它们如何映射到数据库架构的详细信息。

因此,在您进行更改后,EF 无法做到这一点。一种选择是在相应的项目中创建IDesignTimeDbContextFactory

public class ApiRegistrationSqliteDataContextContextFactory : IDesignTimeDbContextFactory<ApiRegistrationSqliteDataContext>
{
    public ApiRegistrationSqliteDataContext CreateDbContext(string[] args)
    {
       var optionsBuilder = new DbContextOptionsBuilder<ApiRegistrationSqliteDataContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

       return new ApiRegistrationSqliteDataContext(optionsBuilder.Options);
    }
}  

此外,如果您使用 VS 包管理器控制台进行迁移,请确保您已设置正确的启动项目(在解决方案资源管理器中)和默认项目(在包管理器控制台中)。

同时尝试运行 Add-Migration 并指定 Verbose 标志:

Add-Migration SomeName -Context ApiRegistrationSqliteDataContext -OutputDir Migrations\ApiRegistrationSqliteMigrations -Verbose

【讨论】:

  • 非常感谢,这完美解决了我的问题,让我省了很多麻烦
  • @user3079834 很乐意提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2014-04-17
  • 1970-01-01
  • 2020-12-22
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多