【问题标题】:MaxLength Attribute in EF4.3.1EF4.3.1 中的 MaxLength 属性
【发布时间】:2012-05-20 02:36:18
【问题描述】:
 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.dllEntityFramework.dll 都包含 System.ComponentModel.DataAnnotations.MaxLengthAttribute。问题是每个 dll 还包含对 EF 代码优先设计至关重要的其他类。例如:

EntityFramework.dll:
 - System.Data.Entity.DbModelBuilder

System.ComponentModel.DataAnnotations.dll:
 - System.ComponentModel.DataAnnotations.RegularExpressionAttribute

【问题讨论】:

    标签: asp.net-mvc entity-framework ef-code-first .net-4.5


    【解决方案1】:

    将此语句添加到您的班级顶部

     using System.ComponentModel.DataAnnotations;
    

    System.ComponentModel.DataAnnotations 命名空间分布在 EntityFramework.dllSystem.ComponontModel.DataAnnotations.dll 之间。因此,您需要在项目中添加对这两者的引用以使用 DataAnnotations。

    MaxLenth 属性存在于EntityFramework.dll 中。因此,请确保您的项目引用部分中有对该 dll 的引用。

    编辑: 从 .NET 框架 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 命名空间中定义。

    【讨论】:

    • 感谢您的回复,但请再次阅读问题。我遇到的问题是我需要两个 dll,并且我有引用和 using 语句集,但这个事实会产生冲突。 System.ComponentModel.DataAnnotations.MaxLengthAttribute 也存在于 System.ComponentModel.DataAnnotations.dll 中。生病编辑以包含该信息
    • @MihalisBagos:我有你的问题。这是因为 .NEt 4.5 在 DataAnnotations.dll 中有这个命名空间。所以你应该根据那个改变你的EF版本。查看我更新的答案。
    • 现在明白了,谢谢!我试图了解我做错了什么...... nuget 包的命令是 Install-Package EntityFramework -Pre 的价值
    • 我已经在使用 EF 5.0 但 .NET 4。通过将我的项目更改为 .NET 4.5,我开始看到这个问题。我的 EntityFramework 引用指向 .NET4.0,如引用路径所示:packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll。为了解决这个问题,我删除了引用和我的 packages.config 文件并重新开始。固定。
    • @Shyju - 我今天刚遇到这个问题。我基本上是在尝试从 .NET 4.0 -> .NET 4.5 升级我的应用程序。但是我想稍后升级 EF(对于单个构建来说要担心的事情更少)。但是通过阅读这个答案/cmets,听起来不可能?
    【解决方案2】:

    我没有选择升级项目以使用 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 的开发机器复制到同一位置的构建服务器来解决问题。 (注:我们只需要复制这个文件夹,不需要在构建服务器上安装 VS)。

    更多信息在这里:http://marcgravell.blogspot.co.uk/2012/09/iterator-blocks-missing-methods-and-net.html

    希望这对其他人有帮助!

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2018-05-15
      • 1970-01-01
      相关资源
      最近更新 更多