Метод TypeLoadException 'Set' не имеет реализации

Я использую этот InventoryMgmtContext повсюду в своем приложении, и я не прикасался к нему годами. Но сейчас я пытаюсь использовать его в новом тестовом проекте и получаю эту проблему. Обычное приложение по-прежнему работает нормально, проблема возникает только при попытке запустить этот тест. И все это проходит компиляцию. Ошибка возникает во время выполнения во время выполнения теста.

Я видел похожий вопрос, но ни один из ответов подал заявку или работал на меня.

Обратите внимание, что все эти вовлеченные проекты находятся в одном и том же решении. Вот несколько вещей, которые я пробовал.

  • Очистка и восстановление проекта.
  • Удаление файлов вручную в папке 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();
    }    
}

Частичный класс 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();

person crichavin    schedule 13.02.2019    source источник
comment
Модель базы данных может быть изменена, и вам необходимо ее обновить: см. раздел 5. Работа с изменениями модели: docs.microsoft.com/en-us/ef/ef6/modeling/designer/workflows/   -  person jdweng    schedule 13.02.2019
comment
Единственное, что дает номер версии вроде 1.5.6983.16416, — это практически гарантирует, что вы будете использовать неправильную версию. Удалите все связыванияRedirect, которые вы могли использовать для решения проблемы с номером версии, используйте Fuslogvw.exe, чтобы убедиться, что вы получили ожидаемую DLL.   -  person Hans Passant    schedule 13.02.2019
comment
@jdweng - я использовал функцию обновления модели из базы данных, чтобы убедиться, что она синхронизирована. Все та же проблема, но спасибо за идею попробовать.   -  person crichavin    schedule 13.02.2019
comment
@HansPassant У меня нет связыванияRedirects в файле app.config в этом проекте ни для одной из внутренних dll проекта, таких как OTIS.Domain.dll ... только для сторонних dll. Я запустил fuslogvw для просмотра привязок во время выполнения тестового проекта. Ошибок не было, и были указаны правильные версии dll.   -  person crichavin    schedule 13.02.2019
comment
Я думаю, что версия не имеет реализации изменилась. Откройте файл .proj и посмотрите, какая версия используется. Иногда я исправляю проблему с типом, редактируя файл проекта и меняя версию. Обычно я создаю новый проект только с объектом, который вызывает проблему. Затем создайте и откройте новый файл .proj и сравните версию с плохим проектом. Зависимости компилятора не очень хороши, и обновление проекта часто не удается. Вы можете начать новый проект с нуля и добавить все модули, которые обычно работают.   -  person jdweng    schedule 13.02.2019
comment
Привет @ChadRichardson, я не могу воспроизвести. Я понимаю, что это довольно старый вопрос, но если вы все еще заинтересованы, не могли бы вы уточнить немного больше? Где находится метод GetAndImportUpdatedProductsProducts() и почему он усечен? В вопросе также есть некоторый код, неправильно отформатированный как таковой. Надеюсь, вы знаете, как создать минимальный, полный и проверяемый пример. Дайте мне знать, если вы отредактируете, чтобы я мог продолжить работу над решением.   -  person Marc.2377    schedule 01.03.2019


Ответы (1)


Я столкнулся с той же проблемой, потому что я использую интерфейс IDbContext без реализации этого метода DbSet<T> Set<T>() where T : class;, но проблема решена, когда я реализую его в своем базовом классе Context в вашем случае. Я думаю, вам нужно реализовать методы IDbContext в этом частичном классе InventoryMgmtContext

person Ahmad Mostafa Awaly    schedule 20.02.2019
comment
Спасибо Ахмад. Но поскольку InventoryMgmtContext наследует DBContext, у которого уже есть эти методы, разве этого не должно быть достаточно? - person crichavin; 21.02.2019
comment
Я думаю, этого недостаточно. Я предполагаю, что вы должны добавить реализацию в InventoryMgmtContext : DbContext, IDbContext для работы, в моем случае я использовал DBcontextBase, а не частичный класс, и реализовал там метод Set - person Ahmad Mostafa Awaly; 21.02.2019
comment
@ChadRichardson да, на самом деле так и должно быть; Я тестировал локально и именно по этой причине не получил исключение TypeLoadException во время выполнения. Возможно, в вашем новом тестовом проекте вы забыли наследоваться от DBContext в одном из определений частичного класса, или их имена/пространства имен не совпали? - person Marc.2377; 01.03.2019
comment
@Marc.2377 Marc.2377 - версия частичного класса, которую EntityFramework создает в этой реализации Database First, не наследуется от DBContext, поэтому я создал еще один частичный класс, который вы можете видеть в моем фрагменте кода, так что он наследуется от DBContext. - person crichavin; 02.03.2019
comment
@ЧадРичардсон прав; но, возможно, в вашем новом тестовом проекте вы забыли это сделать, ошибка, которая не повторяется в вашем вопросе? - person Marc.2377; 02.03.2019
comment
@Marc.2377 Marc.2377 спасибо, что подкинули идеи, я ценю ваше время на это. Проект Test на самом деле является проектом Unit Test, и он ссылается на проект, в котором живет InventoryMgmtContext, у него нет собственного класса InventoryMgmtContext. - person crichavin; 02.03.2019
comment
@ChadRichardson Нет проблем. Я понимаю; Позже я проведу еще несколько тестов, чтобы попытаться воспроизвести проблему. - person Marc.2377; 02.03.2019
comment
Привет, @ChadRichardson, у меня была такая же проблема, как и у тебя. Ошибка в моем решении была вызвана разными версиями пакета nuget EntityFramework. Проблема исчезла после того, как я это исправил. - person Marcel Beeker; 31.05.2019