2015-03-14 5 views
0

У меня установлен целевой .NET-проект .NET .NET Full. Он хорошо работает в Windows 7, 8 и 10..NET 3.5 SP1 требуется для EF SaveChanges

Когда я пытаюсь использовать его в Windows XP, а .NET 4 и SQL Express 2008 R2 установлен, вызов 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 МБ), что мне теперь делать и почему это происходит? Стоит отметить, что у меня также установлен .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()**** 

EDIT

Просто найти this К сожалению сообщения:

ли ваше приложение нужно использовать в базе данных любой из следующих : Типы географии, геометрии или иерархии, пользователь на основе CLR Определенные типы, функции, агрегаты, триггеры или хранимые процедуры?

Если нет, то нет ничего, что помешало бы вам использовать .NET Framework 4 для реализации вашего приложения и использования SQL Server 2008 R2 Express с ним. Он будет отлично работать с .NET Framework 4, поскольку вы не пытаетесь использовать объекты на основе CLR внутри базы данных.

  • Кшиштоф Kozielczyk, менеджер программы для SQL Server Express

И 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 Beta 2 в SP1 означает, что мы больше не размещаем .NET Framework 3.5 SP1. Мы просто не делаем таких изменений, так как мы стараемся, чтобы мы не пытались убедиться, что наши пакеты обновлений не нарушают никаких приложений .

Мое приложение использует в своих процедурах HierarchyId, но скрыто от EF, поскольку оно не поддерживается в настоящее время.

+0

Поддержка XP закончилась год назад, и .NET 3.5 SP1 был выпущен шесть лет назад. Просто обновите среду. Если вы этого не хотите, вам нужно показать больше информации, которая помогает анализировать _why_ ваш код нуждается в этой зависимости. – CodeCaster

+0

@CodeCaster Я считаю, что сам вопрос в том, почему код нуждается в этой зависимости, поскольку «цель проекта установлена ​​на .NET 4 Full». По-видимому, проблема заключается в библиотеке System.Data.SqlClient, которая по-прежнему отображается на более раннюю версию. – GSerg

+0

@GSerg, следовательно, комментарий «больше информации». Это происходит для каждой тривиальной модификации (например, 'dbContext.Foos.Add (new Foo()); dbContext.SaveCanges()' где 'Foos' - очень простая таблица) или для одного изменения, в котором задействованы более сложные концепции например, «Захват данных» в SQL Server? Также, как вы можете видеть в [Вам нужны оба .net 3.5 и 4.0 установлены или просто .net 4?] (Http://stackoverflow.com/questions/2642301/do-you-need-both-net-3-5 -and-4-0-installed-or-just-net-4), некоторые люди сообщают, что должны явно устанавливать 3.5 даже при установке 4. – CodeCaster

ответ

0

Там нет однозначного ответа на этот вопрос, но я нашел обходной путь:

  • На Windows XP корабль .NET 2 SP2 с приложением и установить его вместе с .NET 4. SQL Server будет пытаться загрузить CLR2 и может найти он через .NET 2. Размер загрузки .NET 2 составляет почти одну десятую часть .NET 3.5 SP1.

  • В Windows 7 вперед используйте SQL Server 2012, который использует CLR 4, установленный .NET 4. Поэтому не требуется .NET 2.0 или 3.5 SP1.

4

Эта зависимость .NET 3.5 отсутствует в вашем коде, она находится в справочных библиотеках клиентов SQL Server, ожидающих .NET 3.5. Я помню, что установка объектов управления SQL Server или любых других библиотек .NET для доступа к SQL-серверу потребовала .NET 3.5, даже если .NET 4 был установлен.

Возможно, это ошибка в библиотеках SQL Server, которые являются частью SQL Server, кто-то просто просмотрел .NET 3.5, но не установлен на .NET 3.5 или +.

Даже если вы настроили целевую структуру проекта, это не изменяет зависимости сторонней библиотеки.

Там нет альтернативы не устанавливать .NET 3.5, единственной альтернативой вы можете попробовать это удалив все, что связанно с SQL Server Express более старой версией и установить новую версию 2014.

1

ответ Акашей кавы является большим, я просто хотел добавить, что правильный способ развертывания ваших приложений .NET включает установку как .NET 3.5, так и последней версии 4.x для предотвращения подобных ситуаций.

Причина проста: .NET 2.0 до версии 3.5 Использование CLR 2,0

Все .NET версии от 4-х до последней стабильной в настоящее время 4.5.2 Использование CLR 4,0

Вот почему .NET 4 не заменяет все предыдущие версии, поэтому установите как 3.5, так и 4, чтобы все приложения и библиотеки .NET были совместимы с окружающей средой.

Смежные вопросы