Я использую это InventoryMgmtContext повсюду в своем приложении, и я не прикасался к нему годами. Но сейчас я пытаюсь использовать его в новом тестовом проекте и получаю эту проблему. Обычное приложение по-прежнему работает нормально, проблема возникает только при попытке запустить этот тест. И все это проходит компиляцию. Ошибка возникает во время выполнения во время выполнения теста.
Я видел этот похожий вопрос, но ни один из ответов не подходил и не работал для меня.
Обратите внимание, что все эти вовлеченные проекты находятся в одном и том же решении. Вот несколько вещей, которые я пробовал.
Не уверен, что еще
Ошибка:
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();
}
}
Частичный класс InventoryMgmtContext, созданный Entity Framework DB First, который наследуется от 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();
Единственное, что дает номер версии вроде 1.5.6983.16416, — это практически гарантирует, что вы будете использовать неправильную версию. Удалите все связыванияRedirect, которые вы могли использовать для решения проблемы с номером версии, используйте Fuslogvw.exe, чтобы убедиться, что вы получили ожидаемую DLL.
@jdweng - я использовал функцию обновления модели из базы данных, чтобы убедиться, что она синхронизирована. Все та же проблема, но спасибо за идею попробовать.
@HansPassant У меня нет связыванияRedirects в файле app.config в этом проекте ни для одной из внутренних dll проекта, таких как OTIS.Domain.dll ... только для сторонних dll. Я запустил fuslogvw для просмотра привязок во время выполнения тестового проекта. Ошибок не было, и были указаны правильные версии dll.
Я думаю, что версия не имеет реализации изменилась. Откройте файл .proj и посмотрите, какая версия используется. Иногда я исправляю проблему с типом, редактируя файл проекта и меняя версию. Обычно я создаю новый проект только с объектом, который вызывает проблему. Затем создайте и откройте новый файл .proj и сравните версию с плохим проектом. Зависимости компилятора не очень хороши, и обновление проекта часто не удается. Вы можете начать новый проект с нуля и добавить все модули, которые обычно работают.
Привет @ChadRichardson, я не могу воспроизвести. Я понимаю, что это довольно старый вопрос, но если вы все еще заинтересованы, не могли бы вы уточнить немного больше? Куда относится метод GetAndImportUpdatedProductsProducts() и почему он усечен? В вопросе также есть некоторый код, неправильно отформатированный как таковой. Надеюсь, вы знаете о Как создать минимальный, полный и проверяемый пример. Дайте мне знать, если вы отредактируете, чтобы я мог продолжить работу над решением.





Я столкнулся с той же проблемой, потому что я использую интерфейс IDbContext без реализации этого методаDbSet<T> Set<T>() where T : class;, но проблема решена, когда я реализую его в своем базовом классе Context в вашем случае. Я думаю, вам нужно реализовать методы IDbContext в этом частичном классе InventoryMgmtContext
Спасибо Ахмад. Но поскольку InventoryMgmtContext наследует DBContext, у которого уже есть эти методы, разве этого не должно быть достаточно?
Я думаю, этого недостаточно. Я предполагаю, что вы должны добавить реализацию в InventoryMgmtContext : DbContext, IDbContext для работы, в моем случае я использовал DBcontextBase, а не частичный класс, и реализовал там метод Set
@ChadRichardson да, на самом деле так и должно быть; Я тестировал локально и именно по этой причине не получил исключение TypeLoadException во время выполнения. Возможно, в вашем новом тестовом проекте вы забыли наследоваться от DBContext в одном из определений частичного класса, или их имена/пространства имен не совпали?
@Marc.2377 - версия частичного класса, которую EntityFramework создает в этой реализации Database First, не наследуется от DBContext, поэтому я создал еще один частичный класс, который вы можете видеть в моем фрагменте кода, так что он наследуется от DBContext.
@ЧадРичардсон прав; но, возможно, в вашем новом тестовом проекте вы забыли это сделать, ошибка, которая не повторяется в вашем вопросе?
@Marc.2377 Marc.2377 спасибо, что подкинули идеи, я ценю ваше время на это. Проект Test на самом деле является проектом Unit Test, и он ссылается на проект, в котором живет InventoryMgmtContext, у него нет собственного класса InventoryMgmtContext.
@ChadRichardson Нет проблем. Я понимаю; Позже я проведу еще несколько тестов, чтобы попытаться воспроизвести проблему.
Привет, @ChadRichardson, у меня была такая же проблема, как и у тебя. Ошибка в моем решении была вызвана разными версиями пакета nuget EntityFramework. Проблема исчезла после того, как я это исправил.
Модель базы данных может быть изменена, и вам необходимо обновить ее: см. 5. Работа с изменениями модели: docs.microsoft.com/en-us/ef/ef6/modeling/designer/workflows/…