【发布时间】:2020-05-25 16:16:04
【问题描述】:
我正在 .NET Core 中开发一个控制台应用程序以在数据库中读/写,使用与我之前的应用程序(用于 Web,用 ASP.NET MVC 编写)相同的代码(稍作更改)。
但是,当我查询数据库时,(正在运行的)程序会抛出一个无效的强制转换异常
System.InvalidCastException:“无法将“Microsoft.Data.SqlClient.SqlCommand”类型的对象转换为“System.Data.SqlClient.SqlCommand”类型。”。
但这些命令在我的网络应用程序中运行没有问题。
谁能帮我解决这个问题?
.csproj 文件:
…
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<StartupObject></StartupObject>
</PropertyGroup>
…
<ItemGroup>
…
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.1" />
<PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.0" />
…
</ItemGroup>
我在Program.cs 中的Main 例程,我在其中配置应用程序:
using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.SqlServer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System.Collections.Generic;
…
var optionsBuilder = new DbContextOptionsBuilder<fmDataContext>();
optionsBuilder
.UseSqlServer(connectionString, providerOptions => providerOptions.CommandTimeout(60));
using (fmDataContext context = new fmDataContext(optionsBuilder.Options))
…
我对发生错误的数据库的查询(在我的数据上下文类中):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.SqlServer;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
…
DataTable dt = new DataTable();
DbConnection connection = Database.GetDbConnection();//)
using (DbCommand cmd = connection.CreateCommand())
using (DbDataAdapter sda = new SqlDataAdapter((SqlCommand)cmd))
{
cmd.CommandText = sqlQuery;
cmd.CommandType = CommandType.Text;
connection.Open();
rows_returned = sda.Fill(dt);
connection.Close();
}
【问题讨论】:
-
这与控制台应用程序无关。 .NET Core 3.x(和 EF Core 3.x)使用新库 Microsoft.Data.SqlClient。将
System.Data.SqlClient命名空间替换为Microsoft.Data.SqlClient -
添加到@PanagiotisKanavos 的评论中,两个命名空间都有同名的类(例如
SqlCommand),以方便从.NET 框架迁移到核心,但需要注意使用Microsoft.Data.SqlClient在核心世界。见this announcement。 -
你尝试过干净的构建吗?编译器可能无法识别网络版本中的更改,因此中间目标文件不会使用新的库版本重新编译。
标签: c# sql-server entity-framework .net-core