【发布时间】:2016-08-19 13:51:34
【问题描述】:
来自一个新手Entityframework用户。
在调试我的测试时,我的 DataLayer.DLL 可以访问单独的 DataModels.DLL 中的数据模型,并且可以从 DataModels.DLL 中获取数据模型类的新实例。当我到达 DataLayer 中的上下文并使用:
Entry(entity).State = EntityState.Added;
实体是来自 DataModels.DLL 的模型实例,用于将实体标记为已添加。
然后我得到了异常:"assembly DataModels publicKeyToken="null" not found exception. - 但是程序集 DataModels 已经加载并且它是一个签名的 DLL
这个错误通常意味着它找不到文件。我觉得奇怪的是 DLL 已经加载,所以为什么会出现异常。请参阅下面的详细异常:
LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:FullpathTo/Tests/bin/Debug/Tests.dll.config
LOG:使用主机配置文件:
LOG:使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 中的机器配置文件。
LOG:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。
日志:正在尝试下载新的 URL 文件:///FullpathTo/Tests/bin/Debug/DataModels.DLL。
警告:比较程序集名称导致不匹配:PUBLIC KEY TOKEN
ERR:无法完成程序集设置 (hr = 0x80131040)。探测终止。 HResult=-2146234304
消息=无法加载文件或程序集 'DataModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
内部异常:
我的 DataModel.DLL 已签名。测试项目引用创建 DataModel.DLL 的项目。我的 DataModel.DLL 不在 GAC 中。我不明白为什么 EntityFramework 正在寻找文件的 PublicKeyToken=null 版本。
我的测试项目包含 NUnit 测试我将这些更改为 MSTests 只是为了检查这不仅仅是一个 NUnit 问题,因为我看到了几个关于 NUnit 方法找不到 PublicKeyToken=null 版本的程序集的类似问题。
我也尝试过清理和重建,这偶尔会解决问题,但在大约 15-20 次中始终没有接近 1。
我还从 DataModel 中删除了 DataModel 未使用的所有默认引用。这减少了任何依赖项无法加载的可能性。这解决了几天的问题,然后问题又回来了。
我搜索了原因的答案: “找到的程序集的清单定义与程序集不匹配”
我了解签名版本与未签名版本不同,但老实说,我不明白为什么 EF 正在寻找未签名版本。它们在明显的地方没有,签名的已经加载了。
我已在我的 DataModels.DLL 中添加了一个清单,以确保程序集也有一个与程序集匹配的清单,而不是我过去必须这样做,它通常可以正常工作。
<assemblyIdentity
name="DataModels.dll"
version="1.0.0.0"
publicKeyToken="53ff00ed9cb790e2"
Culture="neutral"
processorArchitecture="msil"/>
在 DataModels.DLL.Manifest 中
我添加了具有匹配依赖项的 Tests.DLL.Manifest:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity
name="DataModels.dll"
version="1.0.0.0"
publicKeyToken="53ff00ed9cb790e2"
Culture="neutral"
processorArchitecture="msil"/>
<bindingRedirect oldVersion= "1.0.0.0"
newVersion="1.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
在 Tests.DLL.Manifest 中
这完全没有什么区别。我认为清单是一个红鲱鱼,我不能 100% 确定我做对了
我已尝试删除 bindingRedirect:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity
name="DataModels.dll"
version="1.0.0.0"
publicKeyToken="53ff00ed9cb790e2"
Culture="neutral"
processorArchitecture="msil"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
也没有成功。
我调查此问题的起点已经有 DataLayer.DLL 引用的 DataModels.DLL。正如我所说,DataLayer 可以成功创建模型的新实例,因此问题似乎在 EF 6.1.3 和我的 DataModels.DLL 之间,出于某种我不明白的原因。
这是我的 Tests.config EF 条目,以防出现问题:
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS2014;Initial Catalog=DbMame;Trusted_Connection=SSPI;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
【问题讨论】:
-
删除 bindingRedirect 部分后会发生什么?
-
要删除我的答案,因为它没有帮助。这有帮助吗:stackoverflow.com/a/21435922/49251?
标签: c# entity-framework dll