The type 'System.ComponentModel.DataAnnotations.MaxLengthAttribute'
exists in both
[path...]\packages\EntityFramework.4.3.1\lib\net40\EntityFramework.dll
and
'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework
\.NETFramework\v4.5\System.ComponentModel.DataAnnotations.dll'
现在,我已阅读on msdn,可以安全地排除EntityFramework引用(通过nuget包添加)。但是,当我这样做时,我无法正确创建DBContext,因为DbModelBuilder类存在于EntityFramework dll中。此外,当我删除EntityFramework参考时,其他一些关键类缺失,所以现在这是旧的和不相关的解决方案。
更新(消除歧义):System.ComponentModel.DataAnnotations.dll
和EntityFramework.dll
都包含System.ComponentModel.DataAnnotations.MaxLengthAttribute
。问题是每个dll还包括对EF代码优先设计至关重要的其他类。例如:
EntityFramework.dll:
- System.Data.Entity.DbModelBuilder
System.ComponentModel.DataAnnotations.dll:
- System.ComponentModel.DataAnnotations.RegularExpressionAttribute
答案 0 :(得分:14)
将此语句添加到您的课程顶部
using System.ComponentModel.DataAnnotations;
System.ComponentModel.DataAnnotations
命名空间在EntityFramework.dll
和System.ComponontModel.DataAnnotations.dll
分布。因此,您需要在项目中添加对这两者的引用以使用DataAnnotations。
MaxLenth属性出现在EntityFramework.dll
中。因此,请确保您对项目参考部分中出现的dll有所引用。
编辑:从.NET framework 4.5开始,此命名空间将移至System.ComponentModel.DataAnnotations.dll
。因此,如果您将.NET Framework 4.5与Entity Framework 4.3.1或更低版本一起使用,您将遇到此冲突。如果您想坚持使用.NET 4.5或降级到.NET 4以使用EntityFramework 4.3.1,解决方案是切换到Entity framework 1.50 beta 1/2版本。
来自msdn文件。
从Entity Framework 5.0 Beta 1开始,EntityFramework.dll 不包含数据注释的定义。这些定义 被移动到System.ComponentModel.DataAnnotations.dll并且是 在System.ComponentModel.DataAnnotations.Schema命名空间中定义。
答案 1 :(得分:6)
我没有选择升级项目以使用EF5,或将构建计算机降级到.Net Framework 4。
虽然有办法解决这个问题!事实证明,当您安装Visual Studio 2012时,它会添加以下文件夹(以及其他文件夹)。
C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0
在VS中,如果打开一个目标为4.0的项目,并查看对System.ComponentModel.DataAnnotations的引用属性,您将看到该路径指向上述位置,而不是GAC。
此文件夹包含原始Framework 4.0程序集。如果它们出现在机器上,那么MSBuild等,在构建一个面向4.0的项目时,将引用这些而不是4.5放入GAC的修改过的。
在我们的例子中,这意味着我们可以通过从安装了VS的dev计算机复制该文件夹到同一位置的构建服务器来解决问题。 (N.b.我们只需复制此文件夹,无需在构建服务器上安装VS)。
此处有更多信息:http://marcgravell.blogspot.co.uk/2012/09/iterator-blocks-missing-methods-and-net.html
希望这有助于其他人!