EF SaveChanges需要.NET 3.5 SP1

时间:2015-03-14 06:05:18

标签: c# .net entity-framework .net-3.5 sql-server-express

我的.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的对象。

     
      
  • SQL Server Express项目经理Krzysztof Kozielczyk
  •   

this

  

所有SQL Server Express功能是否都适用于.NET Framework 4   Beta 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 Engine只能托管一个版本的.NET Framework。在SQL中   Server 2008它是.NET Framework 3.5 SP1。所以托管.NET Framework 4   SP1中的Beta 2意味着我们不再托管.NET Framework 3.5   SP1。我们只是不做这种突破性变化,因为我们尝试   很难确保我们的Service Pack不会破坏任何服务包   应用

我的应用程序在其程序中使用HierarchyId,但它在EF中隐藏,因为它目前不支持它。

3 个答案:

答案 0 :(得分:4)

.NET 3.5的这种依赖性不在您的代码中,而是在SQL Server Client引用库中,它需要.NET 3.5。我记得,即使安装了.NET 4,安装SQL服务器管理对象或任何其他.NET库也可以访问需要.NET 3.5的SQL服务器。

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

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

除了不安装.NET 3.5之外别无选择,您可以尝试的唯一替代方法是卸载与SQL Server Express旧版本相关的所有内容并安装更新版本2014.

答案 1 :(得分:1)

Akash Kava的答案很棒,我只想补充说,部署.NET应用程序的正确方法包括安装.NET 3.5和最新的4.x版本以防止出现这种情况。< / p>

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

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

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

答案 2 :(得分:0)

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

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

  • 在Windows 7转发中,使用SQL Server 2012,它使用.NET 4安装的CLR 4.因此,无论是.NET 2.0还是3.5 SP1都不需要。