c # ado.net: лучший способ сопоставить поля базы данных с собственностью

2

Использование VS2005,.net 2.0, С#

Привет всем,

Каков наилучший способ сопоставления сохраненных столбцов proc с свойствами объекта С# без создания жесткой связи.

Например, я не люблю делать следующее

DataRow row = Getmyrows();
MyObject.MyProperty1 = row["col1"];
MyObject.MyProperty2 = row["col2"];

Итак, когда столбец в сохраненном proc будет изменен на colxyz, тогда двоичный код сломается. Какова наилучшая практика для решения этой проблемы. Образец кода будет полезен и заблаговременно.

Теги:
ado.net

5 ответов

1

Я бы посмотрел на OR mappers. LINQ to SQL, nHibernate, Entity Framework, LLBLGen и т.д. Это позволяет вам настроить отображение через XML или какой-либо другой источник внешней конфигурации. Большинство из них также предоставляют возможность полностью отделить ваши объекты от структуры персистентности, позволяя вашим сущностям быть POCO (обычные объекты CLR). Еще одно преимущество OR-карт заключается в том, что они генерируют SQL для вас "на лету", что позволяет в значительной степени устранить ваш сохраненный уровень proc, который также является связующим звеном, которое может вызвать проблемы (на обоих концах... как в вашем коде, так и в вашем DB).

1

Пара подходит:

  • Если вы вынуждены придерживаться надлежащего ADO.NET, используйте строго типизированный набор данных. Все, что сопоставление между объектами и структурами данных опускается в схеме, где она принадлежит. Затем вы сможете убрать ваши объекты с кодом следующим образом:

    MyObject.MyProperty1 = dataSet.TableName.PropertyName

  • Я заметил, что все остальные сказали то же самое, что я собирался;-) Go w/ORM. Я знаю, что преждевременная оптимизация - это скользкий склон, но вы неизбежно найдете ясное оправдание для этого маршрута. Вы не пожалеете об этом, так как ваши требования станут более сложными, и вы будете изучать ценный набор навыков, который явно набирает обороты в пространстве .NET.

0

Подход, с которым мы с коллегами работали в течение 2.0 дней, заключался в создании пользовательского атрибута, который мы использовали для указания имени поля из таблицы данных, и пометили его свойствами объектов. затем построил универсальный объект-строитель, который будет использовать datareader в качестве параметра (EntityBuilder (IDataReader rdr)); поскольку он работал через datareader, он создавал бы пустой T, отражал бы класс, проходил бы свойства, чтобы получить информацию об пользовательских атрибутах и ​​типе, и установить значение на основе этого.

также имел другой настраиваемый атрибут, который указывал параметр, используемый в наших вставках и обновлениях SPROC, для автоматического заполнения параметров.

0

Лучшим решением является использование надлежащего O/RM, такого как NHibernate, или если вы можете рассчитывать на "меньше" Linq на SQL или Entity Framework.

Однако, если вам нужно, я предлагаю вместо этого использовать IDataReader/SqlDataReader (простейшая, лучшая производительность), но вам не удастся сопоставить имена столбцов, если вы хотите сделать это "трудным путем".

  • 1
    Я бы на самом деле считал, что EF v4.0 гораздо более способный, чем nHibernate. EF v1.0, как правило, является полной потерей, но с выпуском VS2010 и .NET 4.0 надвигается, Entity Framework является твердым конкурентом.
-2

Если вам нужно это сделать и не хотите использовать ORM, сохраните сопоставление имен столбцов в XML файле.

<appSettings>
    <key="prop1" value="col1">
</appSettings>

то в коде сделайте что-то вроде:

myObject.Prop1 = ConfigurationManager.AppSettings["prop1"].Value

Я знаю его неуклюжие и подразумевает чтение из xml (или файла конфигурации) для каждого свойства, но он будет работать.

  • 0
    К сожалению, у него все еще будет проблема жестко закодированной строки в его коде с дополнительными издержками на управление XML-файлом?
  • 0
    @joshua: его беспокоило то, что «когда столбец в хранимой процедуре изменится на colxyz, тогда двоичный код сломается» ... с этим решением двоичный файл НЕ сломается, потому что имя столбца НЕ включено в двоичный файл, если вы не включили XML в двоичный файл во время компиляции. Таким образом, мое решение действительно решает его проблему. И мой ответ говорит, что это неуклюже. Это был бы мой последний вариант. Но это действительно решает его проблему, хотя и не элегантно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню