【问题标题】:System.ComponentModel.DataAnnotations.Schema namespace conflictSystem.ComponentModel.DataAnnotations.Schema 命名空间冲突
【发布时间】:2015-06-08 17:51:10
【问题描述】:

我正在使用 MVC 4、.net 4 和 Entity Framework 6。我的项目正在我的开发机器上构建,该机器安装了 Visual Studio 2010,但在我的构建服务器上,我遇到了命名空间冲突...

“d:\Projects\tools\Apps\LAMS\packages\EntityFramework.6.0.2\lib\net40\EntityFramework.dll”中都存在“System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute”类型和 'c:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.ComponentModel.DataAnnotations\v4.0_4.0.0.0__31bf3856ad364e35\System.ComponentModel.DataAnnotations.dll'

我不确定如何解决这个冲突,我不明白为什么我的开发机器上没有收到冲突。

非常感谢

【问题讨论】:

  • 你确定你在某处没有引用 .NET 4.5+ 的东西吗? System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute 直到 4.5 才添加到 .NET
  • 我已经从构建服务器上卸载了 4.5。我的解决方案无论如何都没有引用它,但如果它这样做了,我希望在删除它后会出现其他构建错误。我没有,但我仍然有上面详述的错误。请问您还有什么建议吗?

标签: c# .net entity-framework namespaces


【解决方案1】:

问题

.NET 4.0 确实不应该包含 System.ComponentModel.DataAnnotations.Schema,所以你会遇到引用冲突有点令人费解,但显然 .NET 4.5 会覆盖 4.0 程序集。

您可以在此post by Marc Gravell 中找到更多信息,其中指出:

事实 1:在 GAC 中,4.5 是 4.0 之上的就地 OTT 安装;安装 4.5 后,4.0 将与 4.5 程序集一起运行

事实 2:如果您的构建服务器没有参考程序集,它会在 GAC 中查找 - 所以……一旦您安装了 4.5,即使您(在您的项目中)要求 4.0,它也会得到 4.5

解决方案

在您的开发机器上,Visual Studio 添加了一个不同的文件夹,用于引用 .NET 4.0 程序集,类似于

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0

您可以将该文件夹复制到您的构建机器上,它应该可以工作,因为 MSBuild 将在构建面向 4.0 的项目时引用这些。

另一方面,由于您已在构建计算机上卸载了 .NET 4.5,因此可能只需重新安装 .NET 4.0 也可以。

另外,请参阅this Stack Overflow answer

【讨论】:

  • 感谢您的回答,使我的情况更加清晰。我确实觉得奇怪的是 buildservers GAC 中的 System.ComponentModel.DataAnnotations.dll 程序集仍然以 .net 4.0.3 为目标,但其中确实有 System.ComponentModel.DataAnnotations.Schema 命名空间。我的本地参考库中此程序集的版本也针对 4.0.3,但没有架构命名空间。如果 buildservers GAC 上的程序集来自 .net 4.5 安装,我希望它以 4.5 为目标(使用反射器查看程序集清单)。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2013-01-26
  • 2010-11-15
  • 2012-12-18
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多