【问题标题】:TypeLoadException Method 'Set' does not have an implementationTypeLoadException 方法“Set”没有实现
【发布时间】:2019-02-13 17:11:40
【问题描述】:

我在我的应用程序中到处使用这个InventoryMgmtContext,而且我已经很多年没有碰过它了。但我现在正试图在一个新的测试项目中使用它并遇到这个问题。常规应用程序仍然运行良好,问题只是在尝试运行此测试时。所有这些都通过了编译。该错误在测试执行期间在运行时抛出。

我确实看到了this similar question,但没有一个答案适用于我或对我有用。

请注意,所有这些涉及的项目都在同一个解决方案中。以下是我尝试过的一些事情。

  • 清理和重建项目。
  • 手动删除我的测试项目的 bin 文件夹中的文件
  • 确保测试项目中引用的 OTIS.Domain.dll 版本是在解决方案构建期间创建的最新版本。

不知道还有什么

错误:

Message: Test method ShopifyAdapterUnitTests.ManageProductTests.GetAndImportUpdatedProductsProducts threw exception: System.TypeLoadException: Method 'Set' in type 'OTIS.Domain.InventoryMgmt.InventoryMgmtContext' from assembly 'OTIS.Domain, Version=1.5.6983.16416, Culture=neutral, PublicKeyToken=null' does not have an implementation.

我的IDbContext界面:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;

namespace InciteCore.Domain
{
    public interface IDbContext
    {
        DbSet<T> Set<T>() where T : class;
        DbEntityEntry<T> Entry<T>(T entity) where T : class;
        int SaveChanges();
        void Dispose();
    }    
}

Entity Framework DB First 创建的部分类InventoryMgmtContext,它继承自System.Data.Entity.DbContext,它有一个Set 方法:

namespace OTIS.Domain.InventoryMgmt
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Core.Objects;
    using System.Data.Entity.Infrastructure;

    public partial class InventoryMgmtContext : DbContext
    {
        public InventoryMgmtContext()
            : base("name=InventoryMgmtContext")
        {
        }
        <...>
     }
}

我创建了自己的部分类声明来扩充 EF,以确保它符合 IDbContext 接口,该接口指定了 Set 方法。 使用 InciteCore.Domain; 使用 System.Data.Entity;

namespace OTIS.Domain.InventoryMgmt
{
    public partial class InventoryMgmtContext : DbContext, IDbContext
    {       

    }
}

我的测试方法,实例化了一个新的InventoryMgmtContext,这是抛出错误的地方。注意我还包括对它的Set 方法的调用!!!那么为什么我会收到这个错误呢?这个项目确实引用了OTIS.Domain.dllInciteCore.Domain

public async Task GetAndImportUpdatedProductsProducts()
{
    InventoryMgmtContext dbContext = new InventoryMgmtContext();
    var items = dbContext.Set<Item>(); <---- Set Method call!!!
    var repository = new InciteCore.Data.Repository<StoreFront>(dbContext);
    var storeFront = await repository.SearchFor(s => s.Id == 8).FirstOrDefaultAsync();

【问题讨论】:

  • 数据库模型可能发生变化,需要刷新:见5.模型变化处理:docs.microsoft.com/en-us/ef/ef6/modeling/designer/workflows/…
  • 像 1.5.6983.16416 这样的版本号所做的唯一一件事实际上就是保证您将使用错误的版本。删除您可能用来解决版本号问题的任何 bindingRedirect,使用 Fuslogvw.exe 来验证您是否获得了您期望的 DLL。
  • @jdweng - 我使用了从数据库更新模型功能来确保它是同步的。仍然是同样的问题,但感谢您提供尝试的想法。
  • @HansPassant 对于像 OTIS.Domain.dll 这样的任何内部项目 dll,我在此项目的 app.config 文件中没有任何 bindingRedirects ......仅适用于第三方 dll。我在运行测试项目时运行了 fuslogvw 来查看绑定。不存在错误,并且引用了正确的 dll 版本。
  • 我认为没有实现的版本已经改变。打开 .proj 文件并查看使用的版本。我有时会通过编辑 proj 文件和更改版本来解决类型问题。通常,我只使用导致问题的对象创建一个新项目。然后构建并打开新的 .proj 文件并将版本与坏项目进行比较。编译器依赖关系不是很好,更新项目经常失败。您可以从头开始一个新项目并添加所有通常可以工作的模块。

标签: c# dll typeloadexception


【解决方案1】:

我遇到了同样的问题,因为我使用 IDbContext 接口而没有实现这个方法DbSet&lt;T&gt; Set&lt;T&gt;() where T : class; 但是当我在我的 Context 基类中实现它时问题解决了我认为你需要在这个部分类中实现 IDbContext 方法@987654322 @

【讨论】:

  • 谢谢艾哈迈德。但是既然 InventoryMgmtContext 继承了 DBContext,已经有了这些方法,那还不够吗?
  • 我认为这还不够,我假设您应该在 InventoryMgmtContext : DbContext, IDbContext 添加实现工作,在我的情况下,我使用 DBcontextBase 而不是部分类并在那里实现方法 Set
  • @ChadRichardson 是的,事实上它应该;由于这个原因,我在本地进行了测试,并没有在运行时得到 TypeLoadException。也许,在您的新测试项目中,您忘记在部分类的定义之一中从 DBContext 继承,或者它们的名称/命名空间不匹配?
  • @Marc.2377 - EntityFramework 在此 Database First 实现中创建的部分类版本不是从 DBContext 继承的,这就是为什么我创建了另一个部分类,您可以在我的代码 sn-p 中看到它, 所以它确实继承自 DBContext。
  • 嗨@ChadRichardson 我遇到了和你一样的问题。我的解决方案中的错误是由不同版本的 EntityFramework nuget 包引起的。修复后问题就消失了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多