【问题标题】:EntityFramework 6.1.3 not finding project assemblyEntityFramework 6.1.3 找不到项目程序集
【发布时间】: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>

【问题讨论】:

标签: c# entity-framework dll


【解决方案1】:

聚会有点晚了。不过,也许有人会觉得它很有用。

先决条件:Entity Framework 6,代码优先迁移。

我遇到了类似的问题。就我而言,问题在于无法正确加载的程序集(在您的情况下为 DataModels.DLL),是在创建迁移之后签名的。

在使用 Entity Framework 6 进行迁移期间,会在 __MigrationHistory 表中创建一条记录。该记录有一个模型列。这是用于迁移的某种模型散列。在运行时,Entity Framework 尝试使用此缓存找到所需的程序集。迁移后对程序集进行签名会更改程序集的完整名称,并且此缓存将变为无效。

添加一个新的迁移,即使是空的,也可以解决这个问题,因为现在 __MigrationHistory 表在 Model 列中有一个具有正确哈希值的新记录。

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多