.NET 4.0数据注释GAC/EntityFramework冲突

6
我正在尝试使用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中右键点击解决方案,然后选择“清理解决方案”,2)右键点击解决方案,然后选择“重新生成解决方案”。虽然不保证一定有效,但这可能会有所帮助,因为错误信息中提到的DLL文件之一位于“Temporary ASP.NET Files”文件夹中。 - user1429080
@user1429080 是的,那是我尝试的第一件事。 - Aleksei Omelaienko
你确定在你的Visual Studio项目中没有任何对System.ComponentModel.DataAnnotations程序集的引用吗? - Evk
你的项目中是否有多个上下文具有相同的表名?如果是这样,请更改表名。 - Sandip
@AlekseiOmelaienko,你在这方面有什么进展吗?我现在也遇到了同样的问题!干杯 - EvalKenEval
@EvalKeneval 很遗憾,当时不得不放弃使用 EF。 - Aleksei Omelaienko
4个回答

0

你尝试过将编译批处理设置为false吗?

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

之前没有尝试过,因为根据描述,似乎没有任何作用。现在尝试了一下,可悲的是,没有看到任何明显的效果。 - Aleksei Omelaienko
似乎对我的问题没有任何作用。 - Aleksei Omelaienko
您也可以尝试创建一个 managePipeLineMode = Integrated 的新应用程序池。 - Fafsi
尽管我看不出管道模式与那个特定案例有什么关系,但我会尝试一下。但由于需要在WS2003/IIS6环境中工作,而该环境没有集成的管道模式支持,所以这是不可能的。 - Aleksei Omelaienko
我检查了我们的服务器,并发现所有的.Net4.0应用程序池都配置为集成模式...但你是对的,IIS6没有这个选项。 - Fafsi
无论如何,我仍然无法理解应用程序池的管道模式与.NET 4.0中的System.ComponentModel.DataAnnotations程序集中是否存在TableAttribute或KeyAttribute有什么关系。 - Aleksei Omelaienko

0

我假设你的App_Code文件夹中有代码(至少可能是你的Entity Framework类?)。

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

否则,你确实需要查看你的项目,并确保没有任何引用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" />

e.g.:

<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>

David,抱歉没有及时回复你的答案。但是很遗憾它与我的问题无关。也许从问题中并不完全清楚,但问题是根本不应该有任何冲突,因为.NET 4.0中的“System.ComponentModel.DataAnnotations”根本不应该包含任何DB模式注释属性,但是仍然存在冲突。是的,使用我网站的预编译版本就没有这样的问题,问题在于我不能使用预编译版本。 - Aleksei Omelaienko
嗨。我已经更新了语法高亮的答案,但您是否尝试在httpRuntime配置中指定targetFramework?即:<httpRuntime targetFramework="4.0" /> - David Moore

-1

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


-1

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


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