2015-11-02 64 views
0

在你认为这是一个重复的问题之前,好吧......也许,但我没有在我的问题的任何地方找到有用的信息。不同的实体框架版本问题

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

两个项目都必须与.NET框架4目标框架进行编译,而且项目B已安装实体框架版本6.1.3。项目A,而不是,有一个较旧的实体框架4.3.1 ...

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

无法加载文件或程序集‘的EntityFramework,版本= 6.0.0.0,文化=中性公钥= b77a5c561934e089’或它的一个依赖”的错误时,项目B请求由项目A.

我试着卸载项目B上的EntityFramework,清理解决方案,重新安装EntityFramework但问题仍然存在。我尝试降低项目B中的EntityFramework,但是我避免了一些浪费的问题(edmx xml版本错误,tt命名空间生成,元数据麻烦,提供者问题......),并且在“正常”情况下转回,之后我必须做一个SVN恢复。

然后,我尝试在项目B的实体框架引用属性上设置“specific version ='True'”,但错误仍然存​​在。不知道是不是在项目中的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> 

而且,当我已重新安装项目EF6.1.3我注意到B,bindingRedirect标记被设置为oldVersion =“0.0.0.0-6.0.0.0”和newVersion =“6.0.0.0”,但使用该配置,项目A是坠毁的人。

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

回答

0

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

不知道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为那个坠毁的人。

我非常接近,但崩溃是因为这个原因:EntityFramework部分注册了4.4.0.0,并导致主项目中的版本冲突。所以,第一步是声明6.0.0.0版本的EntityFramework部分,但这还不够,因为主要项目找不到EF版本6 dll。 Infact,第二步是在assemblyBinding中声明一个<codeBase>标记,并为EF6库设置一个href。在项目的根目录下,在特定文件夹中添加dll,并将其与<codeBase>标记链接,第二步完成,每个EntityFrameworks版本的解决方案中的每个项目似乎都像魅力一样工作!

所以,结论是:

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

2)在项目根创建一个“库”目录的设置后的EntityFramework部分(或名称为任何你像,同样的位置,无论您喜欢...但它必须可以访问),并把EF 6.0图书馆里,有<codeBase>标签链接这里面装配:

已知的副作用:

  • 如果你不希望这个库可以被任何人下载呢,记得要限制该库目录访问,在web.config中,IIS,或最有效的方法根据您的环境

  • 在libs下的EF6库不受Nuget管理,因此,对于将来的EF升级,记住您为了让这个工作起作用而做了什么会很痛苦(写在技术文档中,评论web.config等)

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