Типизированный набор данных, не использующий 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 и затем заново сгенерировать код конструктора.
Следующие шаги должны создать соответствующий файл конструктора:
- Откройте любой XSD-файл в представлении конструктора (при этом загружается DataSetExtensions.dll).
- Щелкните правой кнопкой мыши на 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;
}
}
}
}
Это работает как шарм!!!