.NET 4.0 DataAnnotations GAC/EntityFramework 冲突

Posted

技术标签:

【中文标题】.NET 4.0 DataAnnotations GAC/EntityFramework 冲突【英文标题】:.NET 4.0 DataAnnotations GAC/EntityFramework conflict 【发布时间】:2016-08-13 00:18:26 【问题描述】:

我正在尝试使用 Entity Framework 6 为 Microsoft .NET 4.0 构建一个 ASP.NET 网站。该网站在 web.config 中明确针对 .NET 4.0:

<compilation debug="true" targetFramework="4.0">

applicationhost.config 中的 IIS Express 应用程序池也针对 .NET 4.0:

<add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />

网站启动时,会显示一些CS0433 编译器错误,如下所示:

error CS0433: The type "System.ComponentModel.DataAnnotations.Schema.TableAttribute" exists in both "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.ComponentModel.DataAnnotations\v4.0_4.0.0.0__31bf3856ad364e35\System.ComponentModel.DataAnnotations.dll" and "c:\Users\%username%\AppData\Local\Temp\Temporary ASP.NET Files\vs\e798ee36\2b3f5a24\assembly\dl3\fd34a92a\0052703a_0990d101\EntityFramework.DLL"

据我记得,.NET 4.0 中不应该有 System.ComponentModel.DataAnnotations 程序集,或者至少它不应该包含 TableAttributeKeyAttribute 等类。我唯一的线索是错误页面的底线,上面写着

Microsoft .NET Framework, version:4.0.30319; ASP.NET, version:4.6.1055.0

但是,我不知道如何专门更改网站的 ASP.NET 版本(当然,如果这是问题的根源)。

【问题讨论】:

您是否尝试过:1)在VS中右键单击解决方案,然后选择Clean Solution,2)右键单击解决方案,然后选择Rebuild Solution。这里没有保证,但它可能会有所帮助,因为错误中提到的 DLL:s 之一位于 Temporary ASP.NET Files 文件夹中。 @user1429080 是的,这是我尝试的第一件事。 那么您确定在您的 Visual Studio 项目中的任何地方都没有对 System.ComponentModel.DataAnnotations 程序集的引用? 您的项目中是否有多个上下文具有相同的表名?如果有,请更改表名。 @AlekseiOmelaienko 你在这方面有什么收获吗?我现在也有同样的问题!干杯 【参考方案1】:

您是否尝试将编译批处理设置为 false?

<compilation debug="false" batch="false">

【讨论】:

没有尝试过,因为它似乎没有按照description 做任何事情。现在尝试了 - 遗憾的是,没有明显的效果。 *似乎没有解决我的问题 您也可以尝试使用 managePipeLineMode = Integrated 创建新的应用程序池。 尽管我看不到管道模式与该特定情况有什么关系,但我会尝试一下,但由于生产需要在 WS2003/IIS6 环境中工作,这是不可能的,它有不支持集成管道模式。 我检查了我们的服务器并看到了这一切。 Net4.0 应用程序池使用被配置为集成......但你是对的 iis6 没有那个选项。【参考方案2】:

我假设您的 App_Code 文件夹中有代码(至少可能是您的实体框架类?)。

现在您可以将代码移出那里,并预编译所有内容,以便部署网站程序集而不是任何源文件。

否则,您确实需要查看您的项目并确保没有引用 System.ComponentModel.DataAnnotations。

另外,检查项目根目录或 App_Code 文件夹中的任何 web.config 并确保没有

<add assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

在 system.web/compilation/assemblies 下。如果没有,您甚至可以尝试放入

<remove assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

例如:

<compilation>
    <assemblies>
        <remove assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </assemblies>
</compilation>

您还可以检查以确保它运行的是早期版本的 ASP.NET,以便它选择不具有 Schema 属性的 DataAnnotations 程序集版本(就像 4.5+ 框架版本一样):

<configuration>
  <system.web>
    <httpRuntime targetFramework="4.0" />
  </system.web>
</configuration>

【讨论】:

大卫,很抱歉在适当的时候忽略了您的回答。然而,遗憾的是,它与我的问题无关。也许问题并没有完全清楚,但问题是根本不应该有任何冲突,因为 .NET 4.0 中的 System.ComponentModel.DataAnnotations 应该根本不包含 DB 模式注释属性,但不知何故冲突仍然出现。是的,我的网站的预编译版本没有这样的问题,问题是我不能使用预编译版本。 嗨。我已经更新了语法高亮的答案,但是您是否尝试过在 httpRuntime 配置中指定 targetFramework?即 【参考方案3】:

嘿,你能检查你的项目吗?请检查不应该有两个具有相同属性的模型。模型也可以是实体框架类模型

【讨论】:

【参考方案4】:

检查您项目的所有 NuGet 包是否已更新,或者是否有任何您不想要的安装。

【讨论】:

以上是关于.NET 4.0 DataAnnotations GAC/EntityFramework 冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DataAnnotations 处理 ASP.NET MVC 2 中的布尔值/复选框?

在 ASP.NET WebAPI 中使用 DataAnnotations 验证数据

如何使用 DataAnnotations & Regex - c# - ASP.NET Core

Asp.net DataAnnotations Regex 根据之前的 Char 评估 Char

Asp.Net MVC 中 DataAnnotations StringLength 中文本框的 maxlength 属性

7.DataAnnotations(数据注解)Code-First 系列