class 库中的 C# Datacontext

C# Datacontext in class library

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

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

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

创建迁移

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

错误消息显示为

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 项目中有效,但在我的 class 库中却无效?

作为 docs 状态:

Some of the EF Core Tools commands (for example, the Migrations commands) require a derived DbContext instance to be created at design time in order to gather details about the application's entity types and how they map to a database schema.

所以在你修改后 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 包管理器控制台来处理迁移,请确保您设置了正确的启动项目(在解决方案资源管理器中)和默认项目(在包管理器控制台中)。

也尝试 运行 添加迁移指定 Verbose 标志:

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