Работает ли пакет nuget Microsoft.Data.SqlClient с Entity Framework?

#c# #.net #entity-framework #entity-framework-6 #microsoft-data-sqlclient

#c# #.net #entity-framework #entity-framework-6 #microsoft-data-sqlclient

Вопрос:

Мое приложение работает на .NET Framework 4.7, и я использую Entity Framework 6.1.3. В настоящее время мой код использует некоторые классы из пространства имен, System.Data.SqlClient такие SqlParameter как. Я хочу переключиться на Microsoft.Data.SqlClient .

Однако я не уверен, совместим ли EF6 с Microsoft.Data.SqlClient . Это старая статья от Microsoft, в ней говорится, что EF Core, EF 6 и т.д. Еще не осуществили переход на нового поставщика Microsoft.Data.SqlClient . Итак, я немного запутался.

С System.Data.SqlClient нижеприведенным кодом все работает хорошо

 public async Task<ICollection<int>> GetChildCustomerIdsAsync(int customerId)
{
   var sqlParameters = new List<SqlParameter>()
   {
      new SqlParameter("@CustomerId", customerId)
   };

   return await DbContext.Database.SqlQuery<int>("dbo.sp_GetChildCustomerIds @CustomerId=@CustomerId",
                sqlParameters.ToArray()).ToListAsync().ConfigureAwait(false);
}
  

Однако, когда я переключаюсь на Microsoft.Data.SqlClient , я получаю эту ошибку:

Система.Исключение InvalidCastException: SqlParameterCollection принимает только ненулевые объекты типа SqlParameter, а не объекты SqlParameter.
в System.Data.SqlClient.SqlParameterCollection.ValidateType(значение объекта)
в System.Data.SqlClient.SqlParameterCollection.Добавьте диапазон (значения массива)
в System.Data.Entity.Core.Objects.ObjectContext.CreateStoreCommand(строка CommandText, параметры объекта[])
в System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternalAsync.d__6f`1.MoveNext()

Комментарии:

1. Эта статья по-прежнему верна для EF6. Вы не можете объединить Microsoft.Data.SqlClient с Entity Framework (я полагаю, если вы не позаботитесь о том, чтобы классы были строго разделены). Однако последние версии EF Core перешли на Microsoft.Data.SqlClient .

2. Вы пробовали добавить параметр без @ just new SqlParameter («CustomerID», CustomerID)?

3. @IvanMartinyuk Удаление @ из имени параметра не сработало.

Ответ №1:

Нет, EF 6 не работает с Microsoft.Data.SqlClient, но я опубликовал пакет, который работает.

Пакет NuGet: ErikEJ.EntityFramework.SQLServer

Документация: здесь и здесь

Комментарии:

1. Спасибо @ErikEJ за разъяснение. Не могли бы вы также сказать мне, есть ли какой-либо обходной путь, чтобы заставить приведенный выше код работать, или какой рекомендуемый подход для переключения на Microsoft.Data.SqlClient в моем приложении.

2. Если кому-то нужна дополнительная информация об этом, ее можно найти на github.com/dotnet/SqlClient/issues/725 .

3. Эта проблема является актуальной для поддержки MDS в EF6: github.com/dotnet/ef6/issues/823

Ответ №2:

MS планирует это

https://github.com/dotnet/ef6/issues/823#issuecomment-948340657

Мы планируем на следующий год, и пока это предварительно в плане.

https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/plan#theme-clear-path-forward-from-ef6

Исключением из этого является то, что мы планируем добавить поддержку использования EF6 с Microsoft.Data.SqlClient. Это будет ограничено поддержкой во время выполнения. Для использования конструктора EF6 в Visual Studio по-прежнему потребуется System.Data.SqlClient.


Тем временем вы можете попробовать добавить поставщика, созданного ErikEJ. Это должно помочь.

Пакет NuGet: ErikEJ.EntityFramework.SQLServer

Документация: здесь и здесь