【发布时间】:2015-05-16 17:56:48
【问题描述】:
我的 .NET 项目目标设置为 .NET 4 Full。它在 Windows 7、8 和 10 中运行良好。
当我尝试在安装了 .NET 4 和 SQL Express 2008 R2 的情况下在 Windows XP 中使用它时,对 DbContext.SaveChanges() 的调用会引发异常提示
This functionality requires .NET Framework 3.5 SP1. Please install .NET Framework 3.5 SP1 to use this functionality.
安装 .NET 3.5 SP1 后,错误就会消失。考虑到 .NET 3.5 SP1 安装包 (230 MB) 的大尺寸,我现在应该做什么以及为什么会发生这种情况?值得注意的是,我还安装了 .NET 4.0 KB2468871。
完整的异常信息:
An error occurred while updating the entries. See the inner exception for details.
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at MyApp.Models.MyEntities.SaveChanges()
An error occurred while updating the entries. See the inner exception for details.
at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func`2 updateFunction)
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()
at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__d()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClassb.<SaveChangesInternal>b__8()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()****
This functionality requires .NET Framework 3.5 SP1. Please install .NET Framework 3.5 SP1 to use this functionality.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)
at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()****
编辑
刚刚发现this 悲伤的帖子:
您的应用程序是否需要在数据库中使用 任何 以下:Geography、Geometry 或 HierarchyId 类型、基于 CLR 的用户 定义类型、函数、聚合、触发器或存储过程?
如果没有,那么没有什么可以阻止您使用 .NET Framework 4 实现您的应用程序并使用 SQL Server 2008 R2 Express 用它。只要它与 .NET Framework 4 一起工作,它就可以正常工作 不要尝试在数据库中使用基于 CLR 的对象。
- Krzysztof Kozielczyk,SQL Server Express 项目经理
还有this
是否所有 SQL Server Express 功能都适用于 .NET Framework 4 测试版 2?
不,仍有少数功能需要 .NET Framework 2.0 SP2 或 3.5 SP1。如果 .NET Framework 4 Beta 2,这些功能将被禁用 是机器上唯一的 .NET Framework,但将开始工作 .NET Framework 2.0 SP2 或 3.5 SP1 已安装。
不适用于 .NET Framework 4 Beta 2 的功能列表:
The CLR data types geometry, geography, and hierarchyid. The dynamic management views for assemblies and spatial objects. The CLR user-defined types, functions, aggregates, procedures, and triggers.为什么某些功能不适用于 .NET Framework 4?
SQL Server 引擎只能承载一个版本的 .NET Framework。在 SQL 中 Server 2008 是 .NET Framework 3.5 SP1。所以托管 .NET Framework 4 SP1 中的 Beta 2 意味着我们不再托管 .NET Framework 3.5 SP1。我们根本不做这种破坏性的改变,因为我们尝试 很难确保我们的服务包不会破坏任何 应用程序。
我的应用程序在其过程中使用HierarchyId,但它对 EF 隐藏,因为它目前不支持它。
【问题讨论】:
-
XP 支持已在一年前结束,.NET 3.5 SP1 于六年前发布。请只更新您的环境。如果您不想这样做,则需要显示更多信息以帮助分析为什么您的代码需要此依赖项。
-
@CodeCaster 我相信问题是为什么代码需要这种依赖关系,就像
project target set to .NET 4 Full。显然问题出在 System.Data.SqlClient 库中,该库恰好保持映射到旧版本。 -
@GSerg 因此我的“更多信息”评论。是否会发生每一个微不足道的修改(即
dbContext.Foos.Add(new Foo()); dbContext.SaveCanges(),其中Foos是一个非常简单的表),还是针对涉及更复杂概念(如SQL Server 中的更改数据捕获)的一个更改?此外,正如您在 Do you need both .net 3.5 and 4.0 installed or just .net 4? 中看到的那样,有些人报告说即使安装了 4,也必须显式安装 3.5。 -
@CodeCaster,它发生在一个简单的保存中。虽然目前我无法在 XP 上重现该错误,因为安装时 .NET 要求的 SQL 设置错误。我确定我在没有安装 .NET 3.5 的机器上遇到了这个问题(SQL 正在运行,我的应用程序试图调用 save 并得到这个错误)。
标签: c# .net entity-framework .net-3.5 sql-server-express