添加迁移导致“无法加载程序集”错误

问题描述 投票:0回答:14

这就是我正在看的

PM> Add-Migration AddedSubdivion -StartUpProjectName Data -Verbose
Using StartUp project 'Data'.
Using NuGet project 'Registry'.
Could not load assembly 'Registry'. (If you are using Code First Migrations inside 
Visual Studio this can happen if the startUp project for your solution does not 
reference the project that contains your migrations. You can either change the startUp 
project for your solution or use the -StartUpProjectName parameter.)

我不知道为什么它试图引用

Registry
项目。
Registry
取决于
Data
,而不是相反。我对此很陌生,因此我将不胜感激任何帮助。

entity-framework entity-framework-migrations
14个回答
329
投票

这很尴尬,但也许这会对将来的谷歌员工有所帮助。

在“包管理器控制台”的顶部,我的默认项目设置为错误的项目。将其更改为我的模型项目修复了它。

enter image description here


22
投票

这也可能是由于 .NET Core 和您的项目之间的平台不匹配造成的。您收到错误:

无法加载程序集“DataProject”。确保它被启动项目“ProgramProject”引用。

即使您指定了正确的项目和启动项目名称。 (通过使用 VS 和包管理器控制台中的下拉框,或者使用

-project
-startupproject
参数。)

您可以通过切换到任何 CPU 而不是 x86 来修复它,反之亦然(或者可能切换到 x64 等),但是每次需要更改模型/数据库时您都必须来回切换.

根据这个答案,您可以通过更改系统环境变量中 .NET Core 路径条目的顺序来解决此问题。如果您收到此错误,则意味着第一个 .NET Core 路径适用于 x64,但您正在尝试对 x86 项目进行更改,或者可能是其他方式。将您要定位的目标移到不定位的目标上方,保存,然后重新启动 Visual Studio。

您可以使用命令

dotnet --info
查看当前正在使用哪一个。

(请注意,这假设您已经安装了两者。您也可能只安装了其中一个,在这种情况下,您需要安装另一个,然后检查 PATH 条目的顺序;如果您安装了第二个安装的是你想要的,那么你肯定需要更改 PATH 顺序以使其成为 VS 使用的路径,因为它的条目应该在底部。)


19
投票

如果您将

Package Manager Console
停靠在一个狭窄的窗口上,则问题可能不会那么明显......隐藏默认项目。

它需要广泛的对接。


3
投票

如果全部失败,总会出现

verbose
标志 (
-v
)。

dotnet ef database update -v
这样的命令应该有助于澄清
ef
面临的问题。

就我而言,问题源于 EntityFramework 发现很难处理我的平台目标从

AnyCPU
更改为
x86
x64
的事实。

System.BadImageFormatException: Could not load file or assembly 'MyProject, Culture=neutral, PublicKeyToken=null'. An attempt was made to load a program with an incorrect format.

暂时将平台目标更改为

AnyCPU
效果很好。


2
投票

确保您专注于:

1- 启动项目是 UI(MVC、API 等)。

2- 包管理器控制台中的默认项目位于 (ApplicationDbContext)。


1
投票

我想补充一点,如果您使用.net6预览版,则需要更新软件包。

因此您需要使用预览版本 EntityFrameworkCore.Tools 和 EntityFrameworkCore.SqlServer(从今天开始为 6.0.0-rc-1.21452.10 版本)


0
投票

我遇到了这个确切的问题,结果是因为我在空白解决方案下创建了项目,然后分别添加了类库和Web应用程序,所以它没有启动项目。


0
投票

这些都不适合我。我暂时从解决方案中卸载了不相关的项目,运行命令,然后重新加载该项目。


0
投票

我在将 Asp.Net 5 迁移到 Asp.Net 6 时遇到了这个问题。

问题出在 .csproj 文件中。

这个配置

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>

我刚刚删除了这个属性组并且 dotnet ef 工作了


0
投票

这也可能是由于 .NET Core 和 .NET Core 之间的平台不匹配造成的 还要在您的包裹中检查这一点 如果没有该包依赖注入 很简单,你只需安装依赖注入包


0
投票

您应该在 context.cs 中定义 2 个构造函数和 OnConfiguring 方法。并且在你的 UI 层中你应该定义连接字符串。

像这样:

在 Context.cs 中:

    public Context()
      {
      }
    
      public Context(DbContextOptions<Context> options) : base(options)
      {
      }
    protected override void OnConfiguring(DbContextOptionsBuilder 
   optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Data Source=..");
            }
        }

在appsetting.json中:

"ConnectionStrings": {
    "SqlServer": "Data Source=....."
  }

在Program.cs中:

builder.Services.AddDbContext<Context>(opt =>
{
    opt.UseSqlServer(builder.Configuration.GetConnectionString("SqlServer"));
});

0
投票

如果一个解决方案中有多个项目,那么您必须将该特定项目作为启动项目。 过程: 右键单击项目名称 -> 设置为启动项目。

还可以从项目管理器控制台的下拉列表中选择“默认项目”。


-1
投票

The package manager window has a Default Project Property.

包管理器窗口中设置默认项目为我解决了这个问题。

我还必须将启动项目设置为解决方案资源管理器中的同一应用程序。


-2
投票

将迁移的目标项目设置为启动项目并继续

© www.soinside.com 2019 - 2024. All rights reserved.