Типизированный набор данных, не использующий TypedTableBase в .NET 4 - PullRequest
4 голосов
/ 17 декабря 2010

Я перевожу нашу библиотеку классов DAL в .NET 4 (из .NET 3.5).Мы часто используем типизированные наборы данных, и мы часто перебираем таблицы:

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

Это больше не работает, так как дизайнер изменяет код набора данных, чтобы таблицы больше не выводились из TypedTableBase<T>,но из DataTable (и реализовать неуниверсальный IEnumerable).Это то, что показывает разница.Поэтому строка имеет тип object во время компиляции.

Кто-нибудь знает, является ли это обычным поведением?На данный момент я делаю это так, как показано ниже, но я надеюсь, что есть более элегантное решение:

foreach(var row in ds.MyTable.Cast<MyDs.MyRow>()) var tmp = row.ID;

Ответы [ 3 ]

10 голосов
/ 02 марта 2011

Просто столкнулся с этим сегодня и смог исправить это, выполнив следующее:

Выберите файлы xsd в обозревателе решений и нажмите «Запустить пользовательский инструмент». Файлы конструктора будут регенерированы с использованием TypedTableBase вместо DataTable и IEnumerable.

8 голосов
/ 15 мая 2014

Принятый ответ в основном завершен, но не решит проблему полностью.
Вот репродукция моего вопроса и ответа на этот вопрос .

Проблема:

Короче говоря, проблема возникает, когда запускается инструмент MSDataSetGenerator, но сборка System.Data.DataSetExtensions еще не загружена в текущий процесс Visual Studio.

Решение:

Один из способов загрузить сборку - открыть любой XSD-файл и ТО заново сгенерировать код конструктора.

Следующие шаги должны создать соответствующий файл конструктора:

  1. Открыть любой XSD-файл в представлении конструктора (при этом загружается DataSetExtensions.dll)
  2. Щелкните правой кнопкой мыши XSD и выберите Run Custom Tool

Вот полное пошаговое описание проблемы и решения с фотографиями

Другие экземпляры:

Эта проблема также была сообщена Microsoft в следующих билетах об ошибках:

2 голосов
/ 05 июля 2014

Все это правильно, но в моем случае мне пришлось поддерживать исходный код, который должен работать с .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<MyTypedTableRow> 
        {
            public System.Data.DataRowCollection GetRows()
            {
                return this.Rows;
            }
        }
    }
}

Это работает как шарм !!!

...