不同的实体框架版本问题

时间:2015-11-02 17:53:00

标签: entity-framework

在您认为这是一个重复的问题之前,嗯......它可能但我没有在我的问题的任何地方找到有用的信息。

我有一个主要的Web应用程序项目,我们称之为项目A和子类库项目,项目B。

两个项目都必须使用.NET Framework 4目标框架进行编译,而项目B已安装了Entity Framework V6.1.3。相反,项目A具有较旧的实体框架4.3.1 ...

忘记这个的“更新它”选项:非常不可能,时间到期。我在运行时遇到的问题是:“

  

项目A请求项目B时,无法加载文件或程序集'EntityFramework,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个依赖项“

我尝试在项目B上卸载EntityFramework,清理解决方案,重新安装EntityFramework但问题仍然存在。我试图在项目B中降级EntityFramework,但是我遇到了一系列问题(edmx xml版本错误,tt命名空间生成,元数据问题,提供商问题...),以及在“正常”状态下转回,之后我不得不做一个SVN还原。

然后,我尝试在项目B中的Entity Framework引用属性上设置“specific version ='True'”,但错误仍然存​​在。不知道项目A中的AssemblyBinding是否可能是此问题的一部分,但这是web.config中的配置:

  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" />
  </dependentAssembly>
</assemblyBinding>

此外,我注意到当我在项目B上重新安装EF6.1.3时,bindingRedirect标签设置为oldVersion =“0.0.0.0-6.0.0.0”和newVersion =“6.0.0.0”,但是配置,项目A是崩溃的人。

更具体地说,在这个解决方案中有一个使用Entity Framework 5的项目C类库,并且显示了assemblyBinding,它没有问题......所以,我该怎么办?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

做到了!也许这是一个棘手的方式,太脏或不知道..如果你可以评论有用的副作用,但对我来说这个配置有效!引用自己:

  

不知道项目A中的AssemblyBinding是否可能是此问题的一部分,但这是web.config中的配置:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" /> </dependentAssembly> </assemblyBinding>

  

此外,我注意到,当我在项目B上重新安装EF6.1.3时,bindingRedirect标签设置为oldVersion =&#34; 0.0.0.0-6.0.0.0&#34;和newVersion =&#34; 6.0.0.0&#34;,但有了这个配置,项目A就是那个崩溃的人。

我是如此接近,但崩溃是由于这个原因:EntityFramework部分注册了4.4.0.0,这导致主项目中的版本冲突。因此,第一步是使用版本6.0.0.0声明EntityFramework部分,但是,这还不够,因为主项目无法找到EF版本6 dll。 事实上,第二步是在assemblyBinding中声明一个<codeBase>标记,并为EF6库设置一个href。在项目的根目录中,在特定文件夹中添加了dll,并将其与<codeBase>标记相关联,第二步已完成,解决方案中每个版本的EntityFrameworks的每个项目看起来都像魅力一样! / p>

所以,最后:

1)使用版本6.0.0.0设置EntityFramework部分 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

2)创建&#34; libs&#34;项目根目录中的目录(或者任意你喜欢的名称,相同的位置,你喜欢的位置......但它必须是可以访问的)并将EF 6.0库放在那里,用汇编中的<codeBase>标签链接它:

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> <codeBase version="6.0.0.0" href="libs/EntityFramework.dll" /> </dependentAssembly> </assemblyBinding> </runtime>

已知的副作用:

  • 如果您不希望任何人都可以下载该库,请记住限制访问该libs目录,在web.config,IIS中,或者根据您的上下文使用最有效的方法

  • 在libs下的EF6库不受Nuget管理,因此,对于将来的EF升级,记住你做了什么让这件事工作可能会很痛苦(把它写在技术文档中,评论web.config等等......)

我希望这可能会有所帮助!