Метод 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();

Модель базы данных может быть изменена, и вам необходимо обновить ее: см. 5. Работа с изменениями модели: docs.microsoft.com/en-us/ef/ef6/modeling/designer/workflows/‌​…

jdweng 13.02.2019 18:27

Единственное, что дает номер версии вроде 1.5.6983.16416, — это практически гарантирует, что вы будете использовать неправильную версию. Удалите все связыванияRedirect, которые вы могли использовать для решения проблемы с номером версии, используйте Fuslogvw.exe, чтобы убедиться, что вы получили ожидаемую DLL.

Hans Passant 13.02.2019 18:36

@jdweng - я использовал функцию обновления модели из базы данных, чтобы убедиться, что она синхронизирована. Все та же проблема, но спасибо за идею попробовать.

crichavin 13.02.2019 18:48

@HansPassant У меня нет связыванияRedirects в файле app.config в этом проекте ни для одной из внутренних dll проекта, таких как OTIS.Domain.dll ... только для сторонних dll. Я запустил fuslogvw для просмотра привязок во время выполнения тестового проекта. Ошибок не было, и были указаны правильные версии dll.

crichavin 13.02.2019 19:14

Я думаю, что версия не имеет реализации изменилась. Откройте файл .proj и посмотрите, какая версия используется. Иногда я исправляю проблему с типом, редактируя файл проекта и меняя версию. Обычно я создаю новый проект только с объектом, который вызывает проблему. Затем создайте и откройте новый файл .proj и сравните версию с плохим проектом. Зависимости компилятора не очень хороши, и обновление проекта часто не удается. Вы можете начать новый проект с нуля и добавить все модули, которые обычно работают.

jdweng 13.02.2019 20:20

Привет @ChadRichardson, я не могу воспроизвести. Я понимаю, что это довольно старый вопрос, но если вы все еще заинтересованы, не могли бы вы уточнить немного больше? Куда относится метод GetAndImportUpdatedProductsProducts() и почему он усечен? В вопросе также есть некоторый код, неправильно отформатированный как таковой. Надеюсь, вы знаете о Как создать минимальный, полный и проверяемый пример. Дайте мне знать, если вы отредактируете, чтобы я мог продолжить работу над решением.

Marc.2377 01.03.2019 21:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
2 085
1

Ответы 1

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

Спасибо Ахмад. Но поскольку InventoryMgmtContext наследует DBContext, у которого уже есть эти методы, разве этого не должно быть достаточно?

crichavin 20.02.2019 22:26

Я думаю, этого недостаточно. Я предполагаю, что вы должны добавить реализацию в InventoryMgmtContext : DbContext, IDbContext для работы, в моем случае я использовал DBcontextBase, а не частичный класс, и реализовал там метод Set

Ahmad Mostafa Awaly 21.02.2019 14:34

@ChadRichardson да, на самом деле так и должно быть; Я тестировал локально и именно по этой причине не получил исключение TypeLoadException во время выполнения. Возможно, в вашем новом тестовом проекте вы забыли наследоваться от DBContext в одном из определений частичного класса, или их имена/пространства имен не совпали?

Marc.2377 01.03.2019 21:04

@Marc.2377 - версия частичного класса, которую EntityFramework создает в этой реализации Database First, не наследуется от DBContext, поэтому я создал еще один частичный класс, который вы можете видеть в моем фрагменте кода, так что он наследуется от DBContext.

crichavin 02.03.2019 01:19

@ЧадРичардсон прав; но, возможно, в вашем новом тестовом проекте вы забыли это сделать, ошибка, которая не повторяется в вашем вопросе?

Marc.2377 02.03.2019 01:26

@Marc.2377 Marc.2377 спасибо, что подкинули идеи, я ценю ваше время на это. Проект Test на самом деле является проектом Unit Test, и он ссылается на проект, в котором живет InventoryMgmtContext, у него нет собственного класса InventoryMgmtContext.

crichavin 02.03.2019 01:28

@ChadRichardson Нет проблем. Я понимаю; Позже я проведу еще несколько тестов, чтобы попытаться воспроизвести проблему.

Marc.2377 02.03.2019 01:32

Привет, @ChadRichardson, у меня была такая же проблема, как и у тебя. Ошибка в моем решении была вызвана разными версиями пакета nuget EntityFramework. Проблема исчезла после того, как я это исправил.

Marcel Beeker 31.05.2019 15:44

Другие вопросы по теме