来自新手Entityframework用户。
在调试我的测试时,我的DataLayer.DLL可以在单独的DataModels.DLL中访问我的数据模型,并且可以从DataModels.DLL访问数据模型类的新实例。当我到达DataLayer中的Context并使用:
Entry(entity).State = EntityState.Added;
其中entity是DataModels.DLL中模型的实例,用于将实体标记为已添加。
然后我得到异常:“程序集DataModels publicKeyToken =”null“未找到异常。 - 但程序集DataModels已经加载并且它是一个已签名的DLL
此错误通常表示无法找到该文件。我发现奇怪的是DLL已经加载了,为什么异常。请参阅以下详细例外:
日志:此绑定在默认加载上下文中启动。 日志:使用应用程序配置文件:FullpathTo / Tests / bin / Debug / Tests.dll.config
日志:使用主机配置文件:
日志:使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config中的计算机配置文件。
日志:此时策略未应用于引用(私有,自定义,部分或基于位置的程序集绑定)。
日志:尝试下载新的URL文件:///FullpathTo/Tests/bin/Debug/DataModels.DLL。
警告:比较程序集名称导致不匹配:PUBLIC KEY TOKEN
错误:无法完成装配设置(hr = 0x80131040)。探测终止。 的HResult = -2146234304
Message = 无法加载文件或程序集'DataModels,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT异常:0x80131040)
的InnerException:
我的DataModel.DLL已签名。测试项目引用创建DataModel.DLL的项目。而我的DataModel.DLL不在GAC中。我不明白为什么EntityFramework正在寻找文件的PublicKeyToken = null版本。
My Tests项目包含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>
答案 0 :(得分:0)
聚会晚了一点。但是,也许有人会发现它有用。
先决条件:实体框架6,代码优先迁移。
我有一个类似的问题。就我而言,问题是无法正确加载(在您的情况下为DataModels.DLL)的程序集在创建迁移后 进行了签名。
在使用Entity Framework 6进行迁移期间,在__MigrationHistory表中创建了一条记录。该记录具有“模型”列。这是用于迁移的某种模型哈希。在运行时,Entity Framework尝试使用此缓存查找所需的程序集。迁移后对程序集进行签名会更改程序集的完整名称,并且此缓存无效。
添加新的迁移(即使是空迁移)也可以解决此问题,因为现在__MigrationHistory表具有“模型”列中具有正确哈希值的新记录。