.NET Core 3.0:System.Data的变化

System.Data虽然不引人关注,但在.NET中,System.Data对于各类关系数据库的链接是很是重要的。System.Data也被成为ADO.NET,其前身是ActiveX Data Objects。System.Data提供了经过的框架,在她的基础上.NET数据驱动应用能够被构建。这个框架还提供了数据驱动程序应遵照的一些约定。git

Connections,commands,data readers都是双继承。每一个分别实现了来自于DbConnection, DbCommand,DbDataReader的基础功能。他们也实现了抽象接口IDbConnection, IDbCommand, 和IDbDataReader,这使得它们可以支持模拟场景和非传统数据源。在下文描述的基础类中都基于双继承方案。github

虽然,connection strings通常被认为是字符串,但有些工具却认为它是继承自DbConnectionStringBuilder的对象。它可以处理数据库链接字符串的特定解析并帮助开发人员更好的理解特定数据库的可用设置。sql

在.NET中System.Data早于ORM框架出现,可是经过实现DbDataAdapter和DbCommandBuilder,它提供了生成sql的通用方法。它能够被直接使用,也能和普通数据集及类型化数据集组合使用。数据库

若是你想找到一个抽象工厂模式的例子,你能够看下DbProviderFactory。它的自雷提供了connections, commands, command parameters, command builders, data adapters。其中包含了你须要的所有关于数据访问的需求,而不单单是数据库的逻辑。api

接口的问题框架

在上文中已经提到,System.Data依赖于双继承。当咱们想添加新的方法时,这将带来问题。例如,异步操做被加入到在.NET 4.5的DbCommand之中。可是却没法将他们添加到匹配的IDbCommand接口之中,由于这将是一个破坏性的改变。这意味着您不能同时使用异步操做和容易模拟的抽象接口。异步

微软本能够在.NET Core 1.0中从新设计抽象接口,以使得其可以与抽象类相匹配(Java经过JDBC的接口已经实现了)。然而,这却会使得.NET Framework共用源码变得困难。ide

若是默认接口方法可以出如今C#8.0中,在理论上,这一特征能够用来以向后兼容的方式调整接口。可是在.NET Framework中并不兼容,由于默认接口方法只是.NET Core的特征。它也不能使用较老的编译器和其余.NET语言工具

DbDataReader.Get()中的字符串重载性能

咱们对于System.Data在.NET Core 3.0之中的第一个特征是DbDataReader的Get()方法之中可以传递列名。长期以来,人们一直抱怨这个接口不能按名称引用列。这意味着你须要使用这个模式 。

reader.GetInt32(reader.GetOrdinal("columnName"))

一个明显的(对某些人来讲,也是早就应该有的)简化方法是提供字符串重载。

reader.GetInt32("columnName")

这已经在Oracle's Connector/NET和MySqlConnector中实现。

处于性能考虑,该方法不会被标记为虚方法,从而容许JIT编译器轻松地内联它。也是因为上述缘由,新的方法集不会添加到IDbDataReader中。

XmlDataDocument

若是你了解XmlDataDocument的历史,这彷佛是一个奇怪的选择。在2010年发布的.NET 4.0之中,其已经被标记为过期的,并提出了XmlDataDocument在将来的版本中将会被删除的警告。如今使用它的缘由是一些WinForms和WPF应用程序使用它,在bug报告中称,其在Apiport的各类类别中有1-7%的使用率。

DatasetExtensions

DataTableExtensions在.NET Core 3之中将不在支持。虽然它看起来只是有6个扩展方法的类,可是在不修改System.Data的状况下,咱们没法构建AsDataView方法。缘由至关的复杂,涉及内部方法、类型转发和.NET Standard带来的挑战。

若是你感兴趣,能够与咱们联系连接2)。

本文翻译自System.Data in .NET Core 3.0

相关文章
相关标签/搜索