Неожиданная цепочка исключений после обновления EF 6.x - PullRequest
0 голосов
/ 05 февраля 2020

Я обновился с EF6.2 до EF6.4 и столкнулся с этой цепочкой исключений:

[VerificationException: Operation could destabilize the runtime.]
   System.Data.Entity.Core.Metadata.Edm.FacetDescription.Validate(String declaringTypeName) +70
   System.Data.Entity.Core.Metadata.Edm.FacetDescription..ctor(String facetName, EdmType facetType, Nullable`1 minValue, Nullable`1 maxValue, Object defaultValue, Boolean isConstant, String declaringTypeName) +103
   System.Data.Entity.Core.SchemaObjectModel.FacetDescriptionElement.CreateAndValidateFacetDescription(String declaringTypeName) +115
   System.Data.Entity.Core.SchemaObjectModel.TypeElement.ResolveTopLevelNames() +119
   System.Data.Entity.Core.SchemaObjectModel.Schema.ResolveTopLevelNames() +206
   System.Data.Entity.Core.SchemaObjectModel.Schema.Resolve() +16
   System.Data.Entity.Core.SchemaObjectModel.SchemaManager.ParseAndValidate(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths, SchemaDataModelOption dataModel, AttributeValueNotification providerNotification, AttributeValueNotification providerManifestTokenNotification, ProviderManifestNeeded providerManifestNeeded, IList`1& schemaCollection) +554
   System.Data.Entity.Core.SchemaObjectModel.SchemaManager.ParseAndValidate(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths, SchemaDataModelOption dataModel, DbProviderManifest providerManifest, IList`1& schemaCollection) +156
   System.Data.Entity.Core.SchemaObjectModel.SchemaManager.LoadProviderManifest(XmlReader xmlReader, String location, Boolean checkForSystemNamespace, Schema& schema) +151
   System.Data.Entity.Core.Common.DbXmlEnabledProviderManifest.Load(XmlReader reader) +75
   System.Data.Entity.Core.Common.DbXmlEnabledProviderManifest..ctor(XmlReader reader) +116
   System.Data.Entity.SqlServer.SqlProviderManifest..ctor(String manifestToken) +37
   System.Data.Entity.SqlServer.<>c.<GetDbProviderManifest>b__29_0(String s) +25
   System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) +65
   System.Data.Entity.SqlServer.SqlProviderServices.GetDbProviderManifest(String versionHint) +125
   System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifest(String manifestToken) +55

[ProviderIncompatibleException: The provider did not return a ProviderManifest instance.]
   System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifest(String manifestToken) +187
   System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) +119
   System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) +43
   System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +159
   System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) +124
   System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +678
   System.Data.Entity.Internal.InternalContext.Initialize() +20
   Website.Db.Context..ctor(DbConnection Connection) in Context.vb:15
   Website._Default.GetNewsItems() in Default.aspx.vb:13

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +92
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +191
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19
   lambda_method(Closure , MethodInfo , Object , Object[] ) +39
   System.Web.UI.WebControls.ModelDataSourceView.InvokeMethod(ModelDataSourceMethod method, Boolean isAsyncMethod) +326
   System.Web.UI.WebControls.ModelDataSourceView.InvokeMethod(ModelDataSourceMethod method) +7
   System.Web.UI.WebControls.ModelDataSourceView.GetSelectMethodResult(DataSourceSelectArguments arguments) +68
   System.Web.UI.WebControls.ModelDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +14
   System.Web.UI.WebControls.Repeater.GetData() +233
   System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource) +207
   System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e) +62
   System.Web.UI.WebControls.Repeater.DataBind() +131
   System.Web.UI.WebControls.Repeater.EnsureDataBound() +114
   System.Web.UI.WebControls.Repeater.OnPreRender(EventArgs e) +16
   System.Web.UI.Control.PreRenderRecursiveInternal() +166
   System.Web.UI.Control.PreRenderRecursiveInternal() +236
   System.Web.UI.Control.PreRenderRecursiveInternal() +236
   System.Web.UI.Control.PreRenderRecursiveInternal() +236
   System.Web.UI.Control.PreRenderRecursiveInternal() +236
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4722

Вот строка 15 из Context.vb:

Database.SetInitializer(New MigrateDatabaseToLatestVersion(Of Context, Migrations.Configuration))

Довольно простая база данных позвоните, я бы сказал.

Однако, когда я вернулся к EF6.2, ошибка прекратилась.

Я нахожу множество ссылок на отдельные исключения здесь, на SO, но ничто из того, что я нашел до сих пор, не соответствует контексту сочетания трех, взятых вместе с тем, что делает код (общий доступ к базе данных).

Нужно ли каким-либо образом изменять свой код DAL, чтобы приспособить обновление EF6.4? Были ли какие-то серьезные изменения?

- РЕДАКТИРОВАТЬ -

Работая локально при явном значении Medium Trust, я получаю другую цепочку:

[PolicyException: Execution permission cannot be acquired.]
   System.Security.CodeAccessSecurityEngine.TryResolveGrantSet(Evidence evidence, PermissionSet& grantSet) +14092083
   System.Security.CodeAccessSecurityEngine.ResolveGrantSet(Evidence evidence, Int32& specialFlags, Boolean checkExecutionPermission) +60

[FileLoadException: Could not load file or assembly 'Microsoft.WebTools.BrowserLink.Runtime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. PolicyException thrown. (Exception from HRESULT: 0x80131416)]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +232
   System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark) +176
   System.Reflection.Assembly.LoadFrom(String assemblyFile) +53
   Microsoft.VisualStudio.Web.PageInspector.Runtime.Loader.RuntimeLoader.GetRuntimeAssemblyFromSetupConfiguration(Assembly& runtime) +27
   Microsoft.VisualStudio.Web.PageInspector.Runtime.Loader.RuntimeLoader.LoadRuntime() +26
   Microsoft.VisualStudio.Web.PageInspector.Runtime.Loader.RuntimeLoader.PreApplicationStart() +45

[InvalidOperationException: The pre-application start initialization method PreApplicationStart on type Microsoft.VisualStudio.Web.PageInspector.Runtime.Loader.RuntimeLoader threw an exception with the following error message: Could not load file or assembly 'Microsoft.WebTools.BrowserLink.Runtime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. PolicyException thrown. (Exception from HRESULT: 0x80131416).]
   System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +919
   System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +169
   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +172
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +172
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +854

[HttpException (0x80004005): The pre-application start initialization method PreApplicationStart on type Microsoft.VisualStudio.Web.PageInspector.Runtime.Loader.RuntimeLoader threw an exception with the following error message: Could not load file or assembly 'Microsoft.WebTools.BrowserLink.Runtime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. PolicyException thrown. (Exception from HRESULT: 0x80131416).]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +532
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +111
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +724

Это происходит как в EF6.2, так и в EF6.4.

1 Ответ

2 голосов
/ 05 февраля 2020

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

  1. Проверьте Интернет .config в развернутой сборке, чтобы гарантировать отсутствие переопределений версий зависимостей версии времени выполнения, связанных с EF. (EntityFramework.dll и EntityFramework.SqlServer.dll)

  2. Проверьте версию сборки EntityFramework.dll между развернутым файлом на удаленном сервере и вашим рабочим локальным экземпляром.

  3. Скопируйте развертывание с удаленного сервера в локальную папку, укажите на него IIS, а затем подключите VS к запуску проекта, используя Attach to Process на w3wp.exe. Установите точку останова где-нибудь в коде и убедитесь, что она остается «горячей», способной к попаданию точкой останова, а не неактивной, указывая что-то вроде «точка останова в настоящее время не будет достигнута. Исходная строка не совпадает ...» Это будет означать, что развернутый код не отражает текущую полную перестройку того, что вы используете в VS.

Если вы используете автоматическую сборку:

Убедитесь, что библиотеки зависимостей не регистрируются и что машина сборки активно разрешает пакеты NuGet правильно.

Проверьте ваши ссылки на EF, прежде чем обновлять Версия EF (Контроль версий отменяет все изменения, использует последние созданные и развернутые) В проводнике проекта в разделе «Ссылки» выберите EntityFramework и проверьте указанный путь. Он должен указывать на: {Ваша папка решения} \ packages \ EntityFramework.6.2.0 \ lib \ net45 \ EntityFramework.dll Если он указывает на что-то вроде \ bin \ debug et c. папку, удалите ссылку и исправьте, чтобы она указала на пакет NuGet.

Если отмечена папка с пакетами NuGet, убедитесь, что эта папка заполнена и обновлена ​​в системе контроля версий. При проверке в папках nuget (в отличие от блокировки версии пакета) я нахожу, что это необходимо сделать из Explorer / TFS, поскольку обычные проверки VS не будут включать их в ожидающие изменения. (в отличие от изменений папки / bin, если вы их учитываете). Обновления папки пакета могут быть пропущены при первоначальной проверке, но затем такие вещи, как файлы .ignore, добавляются / обновляются, в результате чего новые файлы .dll не обновляются.

Проверьте наличие устаревших или несоответствующих файлов проекта (.csproj / .vbproj) в вашей локальной среде и того, что находится в системе контроля версий. Часто они могут быть помечены в какой-то момент как «Исключенные файлы», что приводит к автоматической сборке с использованием устаревших ссылок.

Проверьте их и посмотрите, идентифицирует ли это что-либо.

...