Типизированный набор данных, не использующий TypedTableBase в.NET 4

Я перевожу нашу библиотеку классов 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 ответа

Решение

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

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

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

Эта проблема:

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

Решение:

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

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

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

Вот полное пошаговое пошаговое руководство по решению проблемы с фотографиями.

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

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

Все это правильно, но в моем случае мне пришлось поддерживать исходный код, который должен работать с.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;
            }
        }
    }
}

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

Другие вопросы по тегам