#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
Мы планируем на следующий год, и пока это предварительно в плане.
Исключением из этого является то, что мы планируем добавить поддержку использования EF6 с Microsoft.Data.SqlClient. Это будет ограничено поддержкой во время выполнения. Для использования конструктора EF6 в Visual Studio по-прежнему потребуется System.Data.SqlClient.
Тем временем вы можете попробовать добавить поставщика, созданного ErikEJ. Это должно помочь.
Пакет NuGet: ErikEJ.EntityFramework.SQLServer