从 SQL Server Compact 4.0 迁移到 SQL Server Express 后提供程序错误
Posted
技术标签:
【中文标题】从 SQL Server Compact 4.0 迁移到 SQL Server Express 后提供程序错误【英文标题】:Provider error after migrating from SQL Server Compact 4.0 to SQL Server Express 【发布时间】:2017-05-02 05:24:28 【问题描述】:我们决定从 SQL Server Compact 迁移到 SQL Server Express(可能是 LocalDB),因为不再支持 Compact,我们相信 Express 功能更丰富,性能可能更好。
我进行了必要的更改(尽管显然遗漏了一些东西:))并且数据库被重新创建为.mdf
文件。问题似乎出在访问数据库时。我收到了我在下面粘贴的错误。结果是,不知何故,当我无意这样做时,我似乎在某个地方引用了具有不变名称System.Data.SqlServerCe.4.0
的提供者。
我研究了一下,找到了这两个相关的帖子,没有完全回答:
MVC app erroring on SqlServerCe.4.0 provider after converting to Sql Express 和 Entity Framework using the wrong connection provider我已尝试删除迁移并修改了 app.config
文件。我还从项目引用中删除了对 SQL Server Compact 的引用。我还应该看什么?我正在为此撕毁我的头发。
我还可以提供哪些其他信息?
谢谢,
戴夫
附:另一种提问方式是指出https://***.com/users/183934/erikej 在上面的链接中评论:
“很明显,您在 .settings 或基于代码的配置 DbConfiguration 类中引用了 sqlce... – ErikEJ 2014 年 9 月 13 日 6:09”
Compact 可以引用的所有可能的地方在哪里?
抛出异常:EntityFramework.dll 中的“System.Data.DataException” 抛出异常:mscorlib.dll 中的“System.Data.DataException” 线程 0x2df0 已退出,代码为 0 (0x0)。 05.01.2017 21:50:50:致命 [行:18 StartupErrorViewModel -> .ctor()]:System.Data.DataException:初始化数据库时发生异常。有关详细信息,请参阅 InnerException。
System.Data.Entity.Core.MetadataException:指定的架构无效。 >
错误: (0,0):错误 0152:没有为具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序找到实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。请参阅http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。 在 System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader.ThrowOnNonWarningErrors() 在 System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader.LoadItems(IEnumerable
1 xmlReaders, IEnumerable
1 sourceFilePaths) 在 System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader..ctor(IEnumerable1 xmlReaders, IEnumerable
1 sourceFilePaths,布尔 throwOnError,IDbDependencyResolver 解析器) 在 System.D 线程 0x6d84 以代码 0 (0x0) 退出。 ata.Entity.Core.Metadata.Edm.StoreItemCollection.Init(IEnumerable1 xmlReaders, IEnumerable
1 filePaths, Boolean throwOnError, IDbDependencyResolver resolver, DbProviderManifest& providerManifest, DbProviderFactory& providerFactory, String& providerInvariantName, String& providerManifestToken, Memoizer2& cachedCTypeFunction) at System.Data.Entity.Core.Metadata.Edm.StoreItemCollection..ctor(IEnumerable
1 xmlReaders) 在 System.Data.Entity.Utilities.XDocumentExtensions.GetStorageMappingItemCollection(XDocument 模型,DbProviderInfo&providerInfo) 在 System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument 源模型,XDocument 目标模型,Lazy1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion) at System.Data.Entity.Internal.InternalContext.ModelMatches(VersionedModel model) at System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata, DatabaseExistenceState existenceState) at System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata, DatabaseExistenceState existenceState) at System.Data.Entity.CreateDatabaseIfNotExists
1.InitializeDatabase(TContext 上下文) 在 System.Data.Entity.Internal.InternalContext.c__DisplayClassf1.<CreateInitializationAction>b__e() at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) --- End of inner exception stack trace --- at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) at System.Data.Entity.Internal.RetryAction
1.PerformAction(TInput 输入) 在 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 action) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet
1.Initialize() 在 System.Data.Entity.Internal.Linq.InternalSet1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery
1.System.Collections.Generic.IEnumerable.GetEnumerator() 在 System.Collections.Generic.List1..ctor(IEnumerable
1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at Med.Vax.DataAccess.Repositories.LocalDbRepository
1.GetAll() 在 C:\MedRepo\vax-box-sw\App\DataAccess\Repositories\LocalDbRepository.cs:line 68 在 Med.Vax.App.d__28.MoveNext() 在 C:\MedRepo\vax-box-sw\App\App\App.xaml.cs:line 198 --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 ta'Vax.exe'(CLR v4.0.30319:Vax.exe):加载 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemXmlLinq\v4。 0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemXmlLinq.dll'。跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。 “Vax.exe”(CLR v4.0.30319:Vax.exe):加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemCore\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemCore.dll”。跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。 sk) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 Med.Vax.App.d__30.MoveNext() 在 C:\MedRepo\vax-box-sw\App\App\App.xaml.cs:line 503
基于评论的附加信息
有两个app.config
文件,这可能是问题的一部分。一个在主应用程序部分,一个在数据访问层。请注意用<!-- -->
注释掉的代码,我认为这样做非常好,因为这些只是xml 文件?
这是主应用程序中的那个:
<?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" />
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="TruMed.AccuVax.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="LoggingVerbosity" value="Debug" />
<add key="StartMaximized" value="True" />
<add key="AllowMultipleInstances" value="False" />
<add key="ScreenSaverTimeoutSeconds" value="60" />
<add key="TranslationFile" value="Translation\TranslationData.xml" />
<add key="SoftwareUpgradeDirectory" value="C:\TruMed\SoftwareUpgrade" />
<add key="FirmwareUpgradeDirectory" value="C:\TruMed\FirmwareUpgrade" />
<add key="PerformDatabaseMaintenance" value="False" />
<add key="AWSRegion" value="us-west-2"/>
<add key="AWSProfilesLocation" value="C:\TruMed\AccuVax\credentials"/>
</appSettings>
<!--
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
-->
<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>
<userSettings>
<TruMed.AccuVax.Properties.Settings>
<setting name="RobotZParkingLocation" serializeAs="String">
<value>0</value>
</setting>
</TruMed.AccuVax.Properties.Settings>
</userSettings>
</configuration>
这是来自数据访问层的一个:
<?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" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<!--
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
-->
<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>
除了注释掉的部分,我认为我没有提到 SQL Server Compact!
针对评论 2 的附加信息
使用的配置字符串是从 .json 文件中提取的,如下所示:
本地数据库连接:
Server=(LocalDB)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Vax3
以前我用的是:
数据源=C:\ProgramData\TruMed\AccuVax\AccuVax.sdf;
很明显,当我收到有关 SQL Server Compact 的消息时,有人担心我使用了错误的连接字符串和/或适配器。我搜索了AccuVax.sdf
的代码,但没有找到任何实例。同样,创建数据库没有问题;问题似乎是在访问它。
【问题讨论】:
你的 edmx 文件? 没有 .edmx 文件。我首先使用实体和代码。我可以发布其他相关部分吗?应用程序配置?机器配置?感谢收看! App.config - ef 部分和连接字符串 谢谢埃里克!我已经添加了 app.config 文件,更重要的是,我正在通过电子邮件向您发送更多详细信息! 请提供连接字符串 【参考方案1】:我们也遇到了同样的问题。我们尝试从 SQL Compact 迁移到 SQL Express。我们追逐并删除了解决方案中对 SQL Compact 的任何引用,但这还不够。
我们的最后一步是彻底清理解决方案(任何不需要打开解决方案的 Visual Studio):
移除 obj、调试、发布...
删除 .vs 文件夹(可能就是那个)
最后,我们重新打开了解决方案,再次尝试并成功了。 希望对您有所帮助。
【讨论】:
以上是关于从 SQL Server Compact 4.0 迁移到 SQL Server Express 后提供程序错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 F# 中的类型提供程序连接到 SQL Server Compact Edition 4.0?
如何部署 SQL Server Compact Edition 4.0?
更改 SQL Server Compact 4.0 的排序规则
SQL Server Compact 4.0 DateTime 精度不包括秒