Использование VS2005,.net 2.0, С#
Привет всем,
Каков наилучший способ сопоставления сохраненных столбцов proc с свойствами объекта С# без создания жесткой связи.
Например, я не люблю делать следующее
DataRow row = Getmyrows();
MyObject.MyProperty1 = row["col1"];
MyObject.MyProperty2 = row["col2"];
Итак, когда столбец в сохраненном proc будет изменен на colxyz, тогда двоичный код сломается. Какова наилучшая практика для решения этой проблемы. Образец кода будет полезен и заблаговременно.
Я бы посмотрел на OR mappers. LINQ to SQL, nHibernate, Entity Framework, LLBLGen и т.д. Это позволяет вам настроить отображение через XML или какой-либо другой источник внешней конфигурации. Большинство из них также предоставляют возможность полностью отделить ваши объекты от структуры персистентности, позволяя вашим сущностям быть POCO (обычные объекты CLR). Еще одно преимущество OR-карт заключается в том, что они генерируют SQL для вас "на лету", что позволяет в значительной степени устранить ваш сохраненный уровень proc, который также является связующим звеном, которое может вызвать проблемы (на обоих концах... как в вашем коде, так и в вашем DB).
Пара подходит:
Если вы вынуждены придерживаться надлежащего ADO.NET, используйте строго типизированный набор данных. Все, что сопоставление между объектами и структурами данных опускается в схеме, где она принадлежит. Затем вы сможете убрать ваши объекты с кодом следующим образом:
MyObject.MyProperty1 = dataSet.TableName.PropertyName
Я заметил, что все остальные сказали то же самое, что я собирался;-) Go w/ORM. Я знаю, что преждевременная оптимизация - это скользкий склон, но вы неизбежно найдете ясное оправдание для этого маршрута. Вы не пожалеете об этом, так как ваши требования станут более сложными, и вы будете изучать ценный набор навыков, который явно набирает обороты в пространстве .NET.
Подход, с которым мы с коллегами работали в течение 2.0 дней, заключался в создании пользовательского атрибута, который мы использовали для указания имени поля из таблицы данных, и пометили его свойствами объектов. затем построил универсальный объект-строитель, который будет использовать datareader в качестве параметра (EntityBuilder (IDataReader rdr)); поскольку он работал через datareader, он создавал бы пустой T, отражал бы класс, проходил бы свойства, чтобы получить информацию об пользовательских атрибутах и типе, и установить значение на основе этого.
также имел другой настраиваемый атрибут, который указывал параметр, используемый в наших вставках и обновлениях SPROC, для автоматического заполнения параметров.
Лучшим решением является использование надлежащего O/RM, такого как NHibernate, или если вы можете рассчитывать на "меньше" Linq на SQL или Entity Framework.
Однако, если вам нужно, я предлагаю вместо этого использовать IDataReader/SqlDataReader (простейшая, лучшая производительность), но вам не удастся сопоставить имена столбцов, если вы хотите сделать это "трудным путем".
Если вам нужно это сделать и не хотите использовать ORM, сохраните сопоставление имен столбцов в XML файле.
<appSettings>
<key="prop1" value="col1">
</appSettings>
то в коде сделайте что-то вроде:
myObject.Prop1 = ConfigurationManager.AppSettings["prop1"].Value
Я знаю его неуклюжие и подразумевает чтение из xml (или файла конфигурации) для каждого свойства, но он будет работать.