Подтвердить что ты не робот

Почему Entity Framework 6.1.3 выбрасывает "Невозможно загрузить тип" System.Data.Entity.Infrastructure.TableExistenceChecker '"

Новая структура проекта и сущности не запускается из-за того, что исключение создается, как только создается экземпляр контекста.

Структура сущности создает следующее исключение:

Не удалось загрузить тип 'System.Data.Entity.Infrastructure.TableExistenceChecker' из сборки 'EntityFramework, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'.

Литература:

  • EntityFramework
  • EntityFramework.SqLServer

Через менеджер пакетов nuget:

Install-Package entityframework

Очень простой контекст и сущность:

public class TextDbContext : DbContext
{
    public TextDbContext()
        : base("Test")
    {
    }

    public DbSet<TestEntity> TestEntity { get; set; }
}

public class TestEntity
{
    public int Id { get; set; } 
    public string Name { get; set; }
}

static void Main(string[] args)
{
    var test = ConfigurationManager.ConnectionStrings["Test"].ConnectionString;

    using (var conn = new SqlConnection(test))
    {
        conn.Open();
        var cmd = new SqlCommand("Select * from testtable", conn);
        var result = cmd.ExecuteReader();
    }
    //exception thrown on this line is the same as the one in the context
    var instance = SqlProviderServices.Instance;

    using (var db = new TextDbContext())
    {
         var item = new TestEntity
         {
             Name = "xyz"
         };
         db.TestEntity.Add(item);
         db.SaveChanges();
    }
}

Вот текущий файл app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>
    <connectionStrings>
        <add name="Test" connectionString="server=localhost;database=Test;Data Source=localhost;Integrated Security=True;Pooling=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup>
       <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
         <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
</configuration>

Трассировка стека выглядит следующим образом:

   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at System.Data.Entity.Utilities.MemberInfoExtensions.GetValue(MemberInfo memberInfo)
   at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(Type providerType)
   at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Internal.AppConfig.<.ctor>b__2(ProviderElement e)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Data.Entity.Internal.AppConfig.<.ctor>b__1()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at System.Data.Entity.Internal.AppConfig.get_DbProviderServices()
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.RegisterDbProviderServices()
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetServiceFactory(Type type, String name)
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 t)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.DbDependencyResolverExtensions.GetServiceAsServices(IDbDependencyResolver resolver, Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.AppConfigDependencyResolver.GetServices(Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.ResolverChain.<>c__DisplayClass6.<GetServices>b__5(IDbDependencyResolver r)
   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Linq.Enumerable.<OfTypeIterator>d__aa`1.MoveNext()
   at System.Data.Entity.Utilities.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)
   at System.Data.Entity.Infrastructure.DependencyResolution.InternalConfiguration.Lock()
   at System.Data.Entity.Infrastructure.DependencyResolution.DbConfigurationManager.<.ctor>b__1()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at System.Data.Entity.Infrastructure.DependencyResolution.DbConfigurationManager.GetConfiguration()
   at System.Data.Entity.DbContext.InitializeLazyInternalContext(IInternalConnection internalConnection, DbCompiledModel model)
   at System.Data.Entity.DbContext..ctor(String nameOrConnectionString)
   at test2.TextDbContext..ctor() in \\srv\users\carl.tierney\Documents\Visual Studio 2013\Projects\test2\test2\test2context.cs:line 13
   at test2.Program.Main(String[] args) in \\srv\users\carl.tierney\Documents\Visual Studio 2013\Projects\test2\test2\Program.cs:line 13
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state
   at System.Threading.ThreadHelper.ThreadStart()
4b9b3361

Ответ 1

Если вы обнаружите, что EF не установлен в Gac, то следующий шаг - удалить его ПОСЛЕ того, как вы заметите версию своего пакета. Я использую NuGet, поэтому я пошел в Инструменты... Менеджер пакетов библиотек... Консоль диспетчера пакетов. Сначала я попробовал графический интерфейс, но деинсталляция не удалась, и на момент написания этой статьи вы можете установить только последнюю версию пакета.

  • Откройте ваше решение и откройте "Инструменты... Диспетчер пакетов библиотеки... Консоль диспетчера пакетов"
  • Выберите проект, который использует EF и имеет проблему
  • Тип Uninstall-package EntityFramework
  • Вам должно быть предложено перезапустить Visual Studio так близко и снова открыть VS и ваше решение
  • Откройте консоль диспетчера пакетов с помощью инструментов... Диспетчер пакетов библиотеки... Консоль диспетчера пакетов
  • Тип Install-package EntityFramework (добавьте -Version x.x.x, если вы устанавливаете более старую версию)
  • Вам должно быть хорошо идти

Ответ 2

У меня была такая же проблема в моем проекте unit test. После нескольких часов поиска неисправностей я заметил, что файл .csproj все еще имел ссылку на мою предыдущую версию EF:

<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.dll</HintPath>
</Reference>

Я просто изменил версию на 6.1.3, и все тесты снова закончились нормально.

Ответ 3

По-видимому, если в GAC есть ссылка на инфраструктуру сущности, и она не совпадает с той, на которую вы ссылаетесь через Nuget, вы получаете эту ошибку. В моем случае это было 6.0.0 в GAC.

Решение:

gacutil -u EntityFramework

Ответ 4

В моем случае, когда я получил эту ошибку, я не смог найти EF в GAC. Так что ничего не было для unistall.

Однако после изучения всех ссылок EF во всех проектах решения было установлено, что один из проектов, на который ссылаются EF 6.1.1 и все остальные 6.1.3. Ответ michaelhawkins помог в этом случае, я удалил все EF из всех проектов, а затем установил ту же самую последнюю версию.

Просто оставляя это здесь, потому что во всех случаях это исключение, скорее всего, связано с конфликтом версий EF, но где конкретно вам нужно искать разрешение конфликта, может зависеть от разных факторов.

Ответ 5

В моем случае мне пришлось удалить EntityFramework.dll из этой папки:

C:\Windows\Microsoft.NET\assembly\GAC_MSIL\EntityFramework

Ответ 6

То же самое случилось со мной

Открыть Visual Studio → Инструменты → Расширения и обновления

  • Проверьте обновления, если обновление, связанное с консолью диспетчера пакетов Nuget, обновит его.

  • Выберите вкладку Все в расширениях и обновлениях, убедитесь, что версия консоли разработчика Nuget Package Manager

введите описание изображения здесь

  1. Откройте папку проекта → Пакеты, затем удалите все об объектной структуре

  2. Если есть файл типа entityframework.deleteme → удалить его и перезапустить Visual Studio

Ответ 7

Есть ли у вас EntityFramework.SqlServer ссылка? Это должно происходить автоматически с помощью сущности. Если не пытаться добавить его в качестве ссылки или через Nuget.

Конечно, если вы являетесь поставщиком SqlServer. если нет, вам нужно добавить своего конкретного поставщика.

Ответ 8

Просто обновите файл package.config в соответствии с версией EF, используемой вами В этом случае это "6.1.3".

Ответ 9

Я получал эту же ошибку после установки Visual Studio 2015 (VS 2015) при выполнении модульных тестов, в которых используется SQL CE. Мое соединение factory равно SqlCeConnectionFactory, а провайдер System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact.

Решение для меня состояло в том, чтобы добавить путь к EntityFramework.SqlServerCompact.dll в список развертывания в моем файле .testsettings. Добавленная строка выглядит так:

<DeploymentItem filename="packages\EntityFramework.SqlServerCompact.6.1.1\lib\net45\EntityFramework.SqlServerCompact.dll" />

Ответ 10

В будущем в моем случае удаление EntityFramework.SqlServer из GAC фиксировало эту ошибку. Сборка была в точности такой же, как и в моей заявке (6.0.0.0 для EntityFramework.dll и EntityFramework.SqlServer.dll). Тем не менее, у меня не было EntityFramework в GAC, когда это исключение произошло.

Я установил ссылки EntityFramework на мое приложение с SQLite Core (x86/x64) с помощью NuGet. Кроме того, я раньше занимался GAC и, скорее всего, сам добавил сборку.

Ответ 11

Изменение значения строки подключения из

"data source=.;initial catalog=[dbname];integrated security=True"

Для

"Server=.;Database=[dbname];integrated security=True"