Я немного читал об интеграции CLR в SQL Server (я использую 2008 R2, но я считаю, что это мало относится к этому вопросу) и столкнулся с темой UDT CLR. После некоторого прочтения я обнаружил, что большинство людей считают их злыми, советуют не использовать их и даже доходят до того, что предполагают, что они вообще не имеют практического применения. Тем не менее, каждое обсуждение, которое я обнаружил о CLR UDT, вращалось вокруг использования их в качестве типов столбцов для хранения объектов в базе данных, но я не мог найти что-либо об их строгом использовании для упрощения связи между приложением и базой данных.
После работы над многими проектами одной из областей, где мне все еще нужно найти решение, которое мне нравится, является связь между прикладным уровнем и уровнями данных, и поэтому меня всегда интересуют новые подходы. Подход, который я обычно использую, заключается в обработке всего доступа к данным через хранимые процедуры. Однако есть одна вещь, которая меня раздражает, это необходимость поддерживать список свойств объекта и соответствующих столбцов таблицы во многих местах. Например, если у меня есть Product
объект данных с 20 свойствами / столбцами, я должен поддерживать этот список свойств в нескольких местах:
- (1x) таблиц базы данных
- (3x) создание / извлечение / обновление тела хранимых процедур
- (3x) создание / получение / обновление списка параметров хранимых процедур
- (3x) код приложения, вызывающий хранимые процедуры (здесь и заключается объектно-реляционное отображение)
- (1x) определение класса объектов данных
И вот здесь я вижу потенциальное не злое приложение для UDT CLR: используя UDT CLR, я могу использовать объекты для связи между приложением и базой данных и перемещать объектно-реляционное отображение в хранимые процедуры. Вот пример того, что я имею в виду:
Хранимая процедура обновления продукта:
CREATE PROCEDURE crudProductUpdate
@Product udtProduct
AS
UPDATE Products
SET Name = @Product.Name,
Manufacturer = @Product.Manufacturer,
Price = @Product.Price,
...
WHERE SKU = @Product.SKU
Код приложения для обновления продукта:
void Update()
{
using (SqlCommand cmd = new SqlCommand("crudProductUpdate", this.DB)
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Product", this);
cmd.ExecuteNonQuery();
}
}
Используя этот подход, я смогу сократить места, где мне нужно вести список свойств / столбцов:
- (1x) таблиц базы данных
- (3x) создание / извлечение / обновление тела хранимых процедур (здесь и заключается объектно-реляционное отображение)
- (1x) определение класса объектов данных
На бумаге это кажется почти легким делом, но я уверен, что я недальновиден, и мне не хватает некоторых недостатков этого подхода и потенциально полезного применения ULT CLR. Итак, вопрос в основном таков: какие недостатки и / или проблемы могут возникнуть при таком подходе? Вы бы порекомендовали (против) использовать этот подход?