在.NET 4中不使用TypedTableBase的类型化数据集

我正在将我们的DAL类库迁移到.NET 4(从.NET 3.5)。 我们经常使用类型化数据集,我们经常迭代表:

foreach(var row in ds.MyTable) var tmp = row.ID; 

这不再起作用,因为设计人员更改数据集的代码,使得表不再从TypedTableBase派生,而是从DataTable派生(并实现非通用的IEnumerable )。 这就是差异所显示的。 因此,该行在编译时是object类型。

有人知道这是否是通常的行为? 目前,我正在按照下面所示的方式进行,但我希望有一个更优雅的解决方案:

 foreach(var row in ds.MyTable.Cast()) var tmp = row.ID; 

刚刚遇到这个,并通过执行以下操作来纠正它:

在解决方案资源管理器中选择xsd文件,然后单击“运行自定义工具”。 将使用TypedTableBase而不是DataTable和IEnumerable重新生成设计器文件。

接受的答案大部分是完整的,但不能完全解决问题。
这是我在这个问题上的问答的再现。

问题:

简而言之, MSDataSetGenerator工具运行时会出现问题,但System.Data.DataSetExtensions程序集尚未加载到当前的Visual Studio进程中。

解决方案:

加载程序集的一种方法是打开任何XSD文件, 然后重新生成设计器代码。

以下步骤应生成相应的设计器文件:

  1. 打开任何XSD文件到设计器视图(这会加载DataSetExtensions.dll)
  2. 右键单击XSD并选择Run Custom Tool

以下是问题和图片解决方案的完整分步演练

其他实例:

在以下错误票证中也向Microsoft报告了此问题:

  • #668724 – MSDataSetGenerator有时会生成错误的输出
  • #733077 – MSDataSetGenerator不生成TypedTableBase派生类

所有这些都是正确的,但在我的情况下,我必须支持需要与.Net 2.0和.Net 4.0一起运行的源代码。 我的目标是尽可能少地改变代码。

我的解决方案是在.Net 4.0下创建一个部分扩展并将其绑定到4.0应用程序。 这看起来像:

 namespace NamespaceOfMyDataSet { public partial class MyDataSet : global::System.Data.DataSet { public partial class MyTypedTable : global::System.Data.TypedTableBase { public System.Data.DataRowCollection GetRows() { return this.Rows; } } } } 

这就像一个魅力!