Метод TypeLoadException 'Set' не имеет реализации - PullRequest
0 голосов
/ 13 февраля 2019

Я использую это 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;using 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 Ответ

0 голосов
/ 20 февраля 2019

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

...