实体框架Code First迁移-启用迁移失败

5
我一直试图使用基于代码的迁移,取得了一些有限的成功,但其中一个问题是我没能告诉它哪个项目有配置信息。它为我生成了一些类,我也算是让它工作了,但我觉得我应该解决配置问题并重新开始。
这是个大错误。现在,我尝试删除所有迁移的东西,发现我无法重新安装它。我已经卸载并重新安装了EF 5,但当我使用Enable-Migrations命令时,会出现异常报告:

System.Runtime.Serialization.SerializationException:对于成员'System.Data.Entity.Migrations.Design.ToolingFacade+GetContextTypeRunner,EntityFramework, Version=4.4.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089',未解析类型。

现在无论我做什么,都好像无法解决这个问题。你有什么建议吗?

1
如果通过Google遇到此问题的其他人可能希望尝试仔细检查所有App.config重映射EF,以确保它们指向正确的版本(.NET 4的4.4,.NET 4.5的5.0)并且确认项目文件引用了正确的DLL。在更新期间,Nuget设法搞砸了其中一些内容,并将其全部正确对齐可以使迁移工具再次正常工作。 - Dan Fitch
@DanFitch 非常感谢,Nuget 的一些小问题导致程序集绑定重定向没有在我切换版本时清除。 - Christopher Thomas
7个回答

29

这是因为我的项目路径中有一个特殊字符,具体来说是一个“&”符号。我删除了该符号,然后一切工作得很好。


1
谢谢,非常好的解决方案。我的项目路径也有一个“&”符号,所以我将其重命名后问题得到了解决。 - Mohsen Alikhani
我一开始并没有想到是'&'字符的问题,但最终发现它确实在我的项目路径中。经过反复查找,将该字符从项目路径中移除后问题得以解决。这难道不应该被视为一个bug吗? - Sir CodesALot

3
很好,我不知道为什么一开始没有问题,但事实证明问题是由于我的一些项目针对.NET 4.5而另一些项目则针对.NET 4.0。这意味着这些项目使用不同版本的EF 5(v5与v4.4),我认为这是引起问题的原因;它试图加载错误版本的DLL。
当我从解决方案中卸载了针对.NET 4.5的项目后,我就可以在针对.NET 4的项目上使用Enable-Migrations。

1
我发现这个问题出现的另一种方式,所以我想在这里分享一下,以备将来参考 :-)
在我们的情况下,我们在Web.config文件中得到了一个无效的绑定重定向:
<dependentAssembly>
   <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
   <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.2.0.0" />
   <codeBase version="6.0.0.0" href="libs/EntityFramework.dll" />
</dependentAssembly>

虽然 NuGet 包版本为 6.2,但程序集版本仍为 6.0.0.0。使用此重定向可能不会影响您的代码,但会破坏 PowerShell EF 命令以及 migrate.exe 工具。
解决方案是要么删除绑定,要么使用正确的版本 - 6.0.0.0。
<dependentAssembly>
   <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
   <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
   <codeBase version="6.0.0.0" href="libs/EntityFramework.dll" />
</dependentAssembly>

你是在暗示 migrate.exe 工具只能与 Entity Framework 的旧版本一起使用吗? - Florian Winter

0

我的项目出现了命名规范错误。例如:MyProject.MyProject.Web,MyProject.MyProject.EntityFramework等。

我将其更改为MyProject.MyProject2.Web等。


0
写这篇文章的原因是,也许有一天它会帮助到某个人——我刚遇到了同样的问题,而(愚蠢的)问题是连接字符串中的主机名有误。

0

我曾经遇到过同样的问题,可能是因为更改了项目名称和/或将其移动到我的项目文件夹结构中所致。然而,通过重新创建项目并手动导入(添加现有项目)所有.cs文件,然后添加新的迁移,最终解决了这个问题。


0

我的项目文件夹路径中有一个单词 Q&A。当我改成 QA 并重新运行迁移时,这个问题就解决了。 在项目路径中避免使用“&”字符作为任何文件夹的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接