首先为 EF 6 代码应用迁移 - 未找到上下文类型

Apply Migrations for EF 6 Code First - no context type was found

我正在处理 WCF .NET Framework 4.8 项目,它的 WCF 在控制台应用程序中自托管。

我已经在 WCF 控制台应用程序引用的它们自己的独立项目中设置了定义的 POCO classes 和 DbContext

我已经在主控制台应用程序的 app.config 中为 DbContext 声明了 连接字符串

当我尝试执行 EnableMigrationsAdd-Migration 等 EF Code First 命令时,它们无法执行并出现错误:

No context type was found in the assembly 'MAL.App.ConsoleHost'

控制台应用程序App.Config

<entityFramework>
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
</entityFramework>
<connectionStrings>
   <add name="AppDbContext" connectionString="Data Source=MySQLEXPRESS;Initial Catalog=MyDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

数据Class图书馆

public class AppDbContext: DbContext
{
    public DbSet<Album> Albums { get; set; }
    public DbSet<AlbumType> AlbumTypes { get; set; }
    public DbSet<Artist> Artists { get; set; }
}

一个 POCO class

public class Album
{
    public Guid AlbumID { get; set; }
    public string AlbumName { get; set; }
    public Guid ArtistID { get; set; }
    public Guid AlbumTypeID { get; set; }
    public int Stock { get; set; }

    public Artist Artist { get; set; }
    public AlbumType AlbumType { get; set; }

}

控制台主程序

static void Main(string[] args)
{
    ServiceHost hostMusicService = new ServiceHost(typeof(MyWebServices));
    hostMusicService.Open();

    Console.WriteLine("Web Services Started. Press [Enter] To Exit  ");
    Console.ReadLine();

    hostMusicService.Close();
}

当您的 DbContext 在与主 运行time 不同的项目中定义并且主 运行time 设置为 Default Project[=44= 时,会发生此错误] 在解决方案中。

首次打开包管理器控制台时,它假定解决方案 默认项目 是您要对其执行命令的项目,例如 Enable-Migrations.

您可以更改解决方案的默认项目,但更简单的解决方法是将包管理器控制台中的默认项目更改或设置为包含您的项目的项目AppDbContext 定义,因为这是您希望在其中管理 Migrations 的项目。

这里有一个问题,仍然将 Solution 中的 Default Project 作为您的控制台应用程序。

  • 解决方案 默认项目 不仅仅是当您按 F5 到 运行 时将执行的项目,这是任何时候使用的项目 Visual Studio 需要在 运行 时间访问 app/web 配置文件。
  • 这与使用 EDMX 设计界面的 EF 的早期版本相同,甚至在使用 DataSet 设计器之前,默认项目 配置文件中的连接字符串也是如此设计时使用的 VS。

您还可以使用大多数 EF CLI 命令的 -ProjectName 参数来传递项目名称,而不是使用默认名称。为简洁起见,我通常将此保留用于存在多个具有上下文的项目的场景,或者尤其是当同一项目中有多个上下文时。您不希望每次 您想要 Add-MigrationUpdate-DataBase 或任何其他像这样的脚手架命令时 都键入项目名称。

要获取有关受支持参数的信息,请在控制台中的命令后使用 -? 开关:

PM> Enable-Migrations -?

NAME
    Enable-Migrations
    
SYNOPSIS
    Enables Code First Migrations in a project.
    
    
SYNTAX
    Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] [-MigrationsDirectory <String>] [-ProjectName <String>] [-StartUpProjectName <String>] [-ContextProjectName <String>] [-ConnectionStringName <String>] 
    [-Force] [-ContextAssemblyName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>]
    
    Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] [-MigrationsDirectory <String>] [-ProjectName <String>] [-StartUpProjectName <String>] [-ContextProjectName <String>] -ConnectionString <String> 
    -ConnectionProviderName <String> [-Force] [-ContextAssemblyName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>]
    
    
DESCRIPTION
    Enables Migrations by scaffolding a migrations configuration class in the project. If the
    target database was created by an initializer, an initial migration will be created (unless
    automatic migrations are enabled via the EnableAutomaticMigrations parameter).
    

RELATED LINKS

REMARKS
    To see the examples, type: "get-help Enable-Migrations -examples".
    For more information, type: "get-help Enable-Migrations -detailed".
    For technical information, type: "get-help Enable-Migrations -full".

PM> 

我找到了答案。您需要在迁移中添加数据 Class 库项目名称,如下所示;

- Enable-Migrations -ProjectName MyContextProjectNameHere -StartUpProjectName MyStartUpProjectNameHere -Verbose

- add-migration Initial -ProjectName MyContextProjectNameHere

-  update-database -ProjectName MyContextProjectNameHere

试试这个命令可能会有帮助。

EntityFrameworkCore\enable-migrations