【问题标题】:EF 5 Enable-Migrations : No context type was found in the assemblyEF 5 Enable-Migrations:在程序集中找不到上下文类型
【发布时间】:2013-05-06 01:31:32
【问题描述】:

我有 4 个项目:

Toombu.Entities : all models are there
Toombu.DataAccess: Mapping, Repository and ToombuContext
Toombu.Logique : Logic of my application
Toombu.Web : MVC 4 application. With all others DLL.

我尝试在 Toombu.Web 中启用迁移,但出现此错误:

No context type was found in the assembly

如何启用迁移?

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4 entity-framework-migrations


    【解决方案1】:

    我很惊讶没有人提到这个问题的明显答案:实体框架需要一个上下文才能使启用迁移工作。 OP 发布的错误消息表明没有找到上下文。当然,这可能是因为包管理器控制台没有“看到”上下文——在这种情况下,接受的答案是一个可能的解决方案(另一种解决方案是我建议的解决方案,如下)。但在任何其他解决方案起作用之前,当前项目(程序集)中必须存在上下文。

    有上下文是什么意思?这意味着您的项目中必须存在一个继承自 DbContext 的类(在 System.Data.Entity 中)。这是一个例子:

    public class MyDbContext : DbContext
    {
        public MyDbContext()
        {
        }
    }
    

    请务必使用

    using System.Data.Entity;
    

    在上面的代码可以访问 DbContext 类并且您已使用 NuGet 为当前项目获取 Entity Framework 4.1 或更高版本之前。

    如果您一直有一个上下文,但包管理器控制台只是没有“看到”它:在 Visual Studio 2013 中,您不必使用 -ProjectName 开关。相反,请转到包管理器控制台(它在视图 | 其他 Windows 列表中可用),并查看出现在包管理器控制台可停靠窗口顶部的两个下拉菜单。第一个下拉菜单是包源;第二个是默认项目。如果您下拉默认项目并在解决方案中选择一个项目,那么您在包管理器控制台中发出的任何命令都将针对所选项目执行。

    【讨论】:

    • 我也觉得很棒。 @Jazimov,我认为你是真正的英雄。
    • 赞成。我知道这已经几个月了,但这正是我遇到的问题,而且很明显是问题所在。就我而言,我剪切并粘贴了代码,但忘记了(PTF)安装 EF 包。永远不要忽视显而易见的事情!
    • 这个答案提醒我,我将 DbContext 重构为另一个程序集(类库)。这将我引向了这个解决方案 (stackoverflow.com/questions/18126711/…),它产生了命令行 enable-migrations -ProjectName nameOfMainProject -ContextProjectName nameOfProjectWithDbContext -Verbose
    • 即使在实体框架版本 6.1.3 中,这个答案也是解决方案
    • 这是我的问题!谢谢你让我省了很多麻烦!
    【解决方案2】:

    在包管理器控制台中使用 -ProjectName 选项:

    Enable-Migrations -ProjectName Toombu.DataAccess -StartUpProjectName Toombu.Web -Verbose
    

    【讨论】:

    • 或者在 PM 控制台顶部的“默认项目:”下拉菜单中选择正确的项目(在 VS2013 中 - 在早期版本中不确定)
    • 是的,这是另一种方式 :-)
    • 我认为这里有错误,-ProjectName Toombu.DataAccess 会在这个项目中启用迁移,而不是在 Toombu.Web 中按要求启用。
    • 这应该可以解决问题:Enable-Migrations -ContextAssemblyName Toombu.DataAccess -ProjectName Toombu.Web -Verbose
    • 首先检查是否有一个上下文文件被添加到项目中。
    【解决方案3】:

    更改默认项目并从下拉列表中选择启动项目:

    【讨论】:

    • @sadjad Kahzaie Sadjad,请联系我。
    【解决方案4】:

    就我而言,缺少 NuGet 包“Microsoft.EntityFrameworkCore.Tools”

    【讨论】:

    • 在这一步之后,我只运行 Add-Migration "firstCommit"。这对我有用
    • 哦,是的,宝贝!就是那个。
    【解决方案5】:

    如果有人仍然面临这个问题。我通过使用以下命令解决了它:

    Enable-Migrations -ProjectName <YOUR_PROJECT_NAME> -ContextTypeName <YOUR_CONTEXT_NAME>
    

    不要忘记使用上下文名称的完整路径。

    【讨论】:

      【解决方案6】:

      您的 dbcontext 在 Toombu.DataAccess 中,因此您应该在 Toombu.DataAccess 中启用迁移。

      【讨论】:

        【解决方案7】:

        按照以下步骤解决问题

        Install-Package EntityFramework-IncludePrerelease
        

        或从 Nuget 包管理器安装实体框架

        重启视觉工作室

        之后我得到“在程序集中找不到上下文类型”

        要解决它 - 这个“无上下文”意味着您需要在应用程序的“模型”文件夹中创建类,并使用 DbContext 之类的后缀 ... 就像这个 AppDbContext。在那里你需要包含一些使用 System.Data.Entity 的库;

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Data.Entity;
        
        
        namespace Oceans.Models
        {
            public class MyDbContext:DbContext
            {
                public MyDbContext()
                {
                }
            }
        }
        

        之后在包管理器上运行以下命令:

        Enable-Migrations -ProjectName <YourProjectName> -ContextTypeName <YourContextName>
        

        我的项目名称是 - MyFirstApp 和 AppDbContext 在模型文件夹内,所以路径就像

        Enable-Migrations -StartUpProjectName MyFirstApp -ContextTypeName MyFirstApp.Models.AppDbContext
        

        【讨论】:

          【解决方案8】:

          感谢您的建议,我通过结合此处的所有解决方案解决了这个问题。起初我创建了 DbContext 模型:

           public class MyDbContext: DbContext
              {
                  public MyDbContext()
                  {
                  }
              }
          

          创建 dbcontext 类后,我使用项目名称运行 enable-migration 命令:enable-migrations -ProjectName YourProjectName

          【讨论】:

            【解决方案9】:

            我在 Models 目录中创建了一个 Class,名为:myData,代码如下:

            using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Web;
            using System.Data.Entity;
            
            namespace Vidly.Models
            {
                public class MyDbContext : DbContext
                {
                    public MyDbContext()
                    {
                    }
                }
            }
            

            使用以下命令重建应用:control-shift-b

            然后在 nuGet 控制台中运行以下命令:

            Enable-Migrations -StartUpProjectName Vidly -ContextTypeName Vidly.Models.MyDbContext -Verbose

            控制台返回:

            使用“Vidly”启动项目。 使用 NuGet 项目'Vidly'。 检查上下文是否针对现有数据库... 为 Vidly 项目启用了 Code First 迁移。 Enable-Migrations -StartUpProjectName Vidly -ContextTypeName Vidly.Models.myData -Verbose

            FrameWork 创建了一个 Migrations 目录并在其中编写了一个 Configuration.cs 模板,其中包含以下代码:

            namespace Vidly.Migrations
            {
                using System;
                using System.Data.Entity;
                using System.Data.Entity.Migrations;
                using System.Linq;
            
                internal sealed class Configuration : DbMigrationsConfiguration<Vidly.Models.MyDbContext>
                {
                    public Configuration()
                    {
                        AutomaticMigrationsEnabled = false;
                    }
            
                    protected override void Seed(Vidly.Models.MyDbContext context)
                    {
                        //  This method will be called after migrating to the latest version.
            
                        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
                        //  to avoid creating duplicate seed data.
                    }
                }
            }
            

            【讨论】:

              【解决方案10】:

              我必须将上述两个 cmets 组合起来。

              在包管理器控制台中设置默认项目,以及将 -ContextTypeName 变量添加到我的完整命令中的 Abhinandan cmets。所以我的命令如下..

              Enable-Migrations -StartUpProjectName RapidDeploy -ContextTypeName RapidDeploy.Models.BloggingContext -Verbose
              

              我的设置::

              • 项目名称 - RapidDeploy
              • BloggingContext(包含 DbContext 的类,文件位于主项目的 Models 文件夹中)

              【讨论】:

                【解决方案11】:

                我的问题是链接----> problem1

                我用一个简单的命令行解决了这个问题

                Install-Package EntityFramework-IncludePrerelease
                

                在那之后,我还需要面对一个问题,比如:

                “在程序集中找不到上下文类型”

                我很容易解决这个问题。这个“无上下文”意味着您需要在应用程序的“模型”文件夹中创建类,并使用 DbContext 之类的后缀......就像这个 MyDbContext。 在那里你需要包含一些库using System.Data.Entity;

                using System;
                using System.Collections.Generic;
                using System.Linq;
                using System.Web;
                using System.Data.Entity;
                
                
                namespace Oceans.Models
                {
                    public class MyDbContext:DbContext
                    {
                        public MyDbContext()
                        {
                        }
                    }
                }
                

                之后,我只需要这个命令行:

                Enable-Migrations -ProjectName <YourProjectName> -ContextTypeName <YourContextName>
                

                【讨论】:

                • 谢谢,效果很好,但在创建类后使用enable-migration 命令。
                【解决方案12】:

                在 mosh 教程中,选择了单个用户帐户,该帐户在模板中创建了一个数据库上下文。 此外,请确保 EntityFramework 已安装在 Nuget 包管理器中。

                【讨论】:

                  【解决方案13】:

                  将默认项目更改为数据访问

                  将包管理器控制台中的默认项目下拉菜单更改为数据访问并启用迁移...

                  一切顺利

                  【讨论】:

                    【解决方案14】:

                    我首先遇到了这个问题: PM> 先添加迁移

                    没有迁移配置类型在程序集“MyProjectName”中找到。 (在 Visual Studio 中,您可以使用包管理器控制台中的 Enable-Migrations 命令添加迁移配置)。

                    然后我尝试了这个:

                    PM> 启用迁移 在程序集“MyProjectName”中找不到上下文类型。

                    那么对我来说正确的命令:

                    PM> Enable-Migrations -ProjectName MyProjectName -ContextTypeName MyProjectName.Data.Context

                    之后,即使 Context 继承自 DbContext,我也收到此错误消息

                    “上下文”类型不继承自 DbContext。 DbMigrationsConfiguration.ContextType 属性必须设置为继承自 DbContext 的类型。

                    然后我安装了 Microsoft.EntityFrameworkCore.Tools

                    现在可以了,但消息很有趣。我已经尝试过添加迁移:D

                    Entity Framework Core 和 Entity Framework 6 都已安装。 Entity Framework Core 工具正在运行。对实体框架 6 使用“EntityFramework6\Enable-Migrations”。 Enable-Migrations 已过时。使用 Add-Migration 开始使用迁移。

                    【讨论】:

                      【解决方案15】:

                      确保您使用 NuGet 包管理器在所有项目中使用相同版本的实体框架。

                      最近的 Windows 更新可能已将较新版本的 Entity Framework 安装到您的活动项目中。

                      背景: 2016 年 3 月 16 日左右,我在尝试将迁移添加到我已经启用迁移并成功完成迁移的项目时开始收到此错误。

                      我注意到在 3 月 10 日左右,Entity Framework 6 的新稳定版本已经发布。

                      如果我在 enable-migrations 命令中指定了 -ContextTypeName 参数,则会收到错误消息,表明迁移已启用。

                      分辨率:

                      1) 工具 -> Nuget 包管理器 -> 管理用于解决方案的 Nuget 包

                      2)(不确定这一步是否必要,但是..)我将 Nuget 包管理器的版本更新到了最新版本。此外,在更新我的 Nuget 包管理器版本后,我必须重新启动 Visual Studio 两次,然后 NuGet 命令行才能正常工作。

                      3) 工具 -> Nuget 包管理器 -> 管理解决方案的 Nuget 包 -> 搜索已安装的包 -> 键入实体框架

                      一个。您可能会在那里看到多个版本的 Entity Framework。

                      b.在每个版本的 Entity Framework 上单击 Manage,并确保您的项目使用相同版本的 Entity Framework。

                      • 取消选中您未使用的 Entity Framework 版本,并为您正在使用的 Entity Framework 版本确保在需要它的项目中对其进行检查。

                      再次,如步骤 2 中所述,在更新我的 NuGet 包管理器版本后,我必须重新启动 Visual Studio 两次才能使 NuGet 包管理器控制台正常工作。我第一次启动控制台时出错,并且 “在第二次运行 enable-migrations 命令时,使用 8 个参数调用 createinstancefrom 的异常无法加载文件或程序集 EntityFramework”。

                      不过,重新启动 Visual Studio 似乎可以解决这些问题。

                      【讨论】:

                        【解决方案16】:

                        由于编译器未在您的应用程序中获取“上下文”类而出现此错误。因此,您可以通过 Add --> Class 手动添加它并使用 'DbContext' Class 继承它 例如:

                        public class MyDbContext : DbContext
                            {
                                public DbSet<Customer> Customer { get; set; }
                                public MyDbContext()
                                {
                                }
                            }
                        

                        【讨论】:

                          【解决方案17】:

                          我也遇到了同样的问题。即使我已经完成了,我什至在上面尝试过启用迁移。但它不断给出同样的错误。然后我不得不使用 force 开关来克服这个问题。我相信这将有助于其他人的情况以及可能的解决方法。

                          启用强制迁移后,您应该更新数据库(确保默认项目设置正确)。否则你会遇到另一个问题,比如显式迁移待处理。

                          然后只需执行您的 add-migrations 或任何其他命令,它应该可以工作。

                          Enable-Migrations -ProjectName <PROJECT_NAME> -ContextTypeName <FULL_CONTEXT_NAMESPACE.YOUR_CONTEXT_NAME> -force
                          

                          【讨论】:

                            【解决方案18】:

                            添加一个继承 DbContext 的类解决了我的问题:

                            public class MyDbContext : DbContext { public MyDbContext() { } }
                            

                            【讨论】:

                              【解决方案19】:

                              如何使用实体framework code第一种方法更新mvc中的表和列

                              1:工具 > 包管理器控制台

                              2:选择当前存在上下文类的项目

                              3:使用以下命令启用迁移 PM &gt; enable-migrations

                              4:使用以下命令添加迁移文件夹名称 PM &gt; add-migration MyMigrationName

                              4: 现在按照命令更新数据库 PM &gt; update-database

                              【讨论】:

                              • 对不起,你是对的,我错过了第二步“选择存在上下文类的当前项目”,其中有 dbcontext。我指向一个 wpf 项目作为启动项目,并在 Package Manger 控制台 EF 项目中选择 g 作为默认项目。也许您应该编辑您的答案以设置为启动项目而不是选择当前项目,因为选择也可以在包管理器控制台中(选择默认项目)。
                              【解决方案20】:

                              enable-migrations -EnableAutomaticMigration:$false 使用此命令,您可以在 Ef 6.3 版本中启用迁移,因为 C# 在 Ef 6.3 版本中启用为默认迁移。

                              【讨论】:

                                【解决方案21】:

                                使用包管理器,需要重新安装实体框架:

                                Uninstall-Package EntityFramework -Force

                                然后为每个项目安装它:

                                Install-Package EntityFramework

                                然后别忘了重启工作室。

                                【讨论】:

                                  【解决方案22】:

                                  我遇到过几次这个问题,在我的情况下,我卸载了 EntityFramework nuget 包并安装了 EntityFrameworkCore nuget 包、entityFramework.design 和 entityframework.tools

                                  【讨论】:

                                    【解决方案23】:

                                    当我禁用身份验证/选择“无身份验证”时,我遇到了同样的错误。我重新制作了我的项目并选择了“个人用户帐户”,但我不再收到错误了。

                                    【讨论】:

                                      【解决方案24】:

                                      当我遇到同样的问题时,我发现我在解决方案资源管理器中重命名了我的项目。 我需要在记事本中打开项目并将旧名称更改为新名称。

                                      【讨论】:

                                        【解决方案25】:

                                        如果您使用 Entity Framework 6 和 Entity Framework Core 都已安装。 Entity Framework 6 工具正在运行。

                                        EntityFrameworkCore\Enable-Migrations 用于 Entity Framework Core。与添加迁移和更新数据库相同。

                                        【讨论】:

                                          【解决方案26】:
                                          namespace EntityFrameworkCodeFirst.Module
                                          {
                                              public class MyDbContext: DbContext
                                              {
                                                  public MyDbContext()
                                                  {
                                                  }
                                              }
                                          }
                                          

                                          如果您在一个解决方案中有多个项目,则必须使用以下命令:-

                                          Enable-Migrations -ProjectName EntityFrameworkCodeFirst
                                          

                                          【讨论】:

                                            【解决方案27】:

                                            为我工作:

                                             UnInstall-Package EntityFramework 
                                            
                                            • 重启 Visual Studio

                                            安装包EntityFramework

                                            • 构建项目

                                            【讨论】:

                                            • 荒谬的答案。这不仅在几乎所有情况下都是完全浪费时间(如果试图解决这个 OP 的问题),而且作者也没有给出卸载/重新安装实体框架或任何提及特定版本等的理由。
                                            猜你喜欢
                                            • 2021-08-31
                                            • 2012-10-13
                                            • 2015-11-23
                                            • 1970-01-01
                                            • 2020-04-19
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2011-12-11
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多