【发布时间】: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.dll 和InciteCore.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