【问题标题】:.NET 3.5 SP1 required for EF SaveChangesEF SaveChanges 需要 .NET 3.5 SP1
【发布时间】: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


【解决方案1】:

.NET 3.5 的这种依赖关系不在您的代码中,它在需要 .NET 3.5 的 SQL Server 客户端参考库中。我记得,安装 SQL Server 管理对象或任何其他 .NET 库来访问 SQL Server 需要 .NET 3.5,即使安装了 .NET 4。

这可能是 SQL Server 库中的一个错误,它是 SQL Server 的一部分,有人只是查找 .NET 3.5 但未设置为 .NET 3.5 或 +。

即使你设置了项目的目标框架,也不会改变第三方库的依赖。

没有不安装 .NET 3.5 的替代方法,您可以尝试的唯一替代方法是卸载与 SQL Server Express 旧版本相关的所有内容并安装新版本 2014。

【讨论】:

    【解决方案2】:

    Akash Kava 的回答很好,我只是想补充一点,部署 .NET 应用程序的正确方法包括安装 .NET 3.5 和最新的 4.x 版本以防止出现这种情况。

    原因很简单: .NET 2.0 到 3.5 版本使用 CLR 2.0

    从 4 到当前最新稳定的 4.5.2 的所有 .NET 版本都使用 CLR 4.0

    这就是为什么 .NET 4 不会取代所有以前的版本,所以安装 3.5 和 4 以使所有 .NET 应用程序和库与环境兼容。

    【讨论】:

      【解决方案3】:

      这个问题没有明确的答案,但我找到了解决方法:

      • 在 Windows XP 上,您的应用程序附带 .NET 2 SP2,并将其与 .NET 4 一起安装。SQL Server 将尝试加载 CLR2 并可以通过 .NET 2 找到它。.NET 2 的下载大小接近 1 .NET 3.5 SP1 的十分之一。

      • 在 Windows 7 之前,使用 SQL Server 2012,它使用由 .NET 4 安装的 CLR 4。因此不需要 .NET 2.0 或 3.5 SP1。

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2012-03-27
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多