Продукт, с которым мы работаем, содержит очень грязную базу данных (это не наш продукт)
- Первичные ключи не определены
- Нет внешних ключей
- Все поля допускают пустое значение без значения null
- 400 столов
Нам часто нужно писать приложения, которые читают или записывают данные из базы данных.
Я бы хотел создать слой поверх базы данных, который немного облегчил бы его использование в наших приложениях. В конечном итоге я хотел бы иметь слой, который может:
- Заменить нулевые значения значением по умолчанию для типа ("", 0 и т. Д.) При чтении
- Добавить навигацию
- Использовать LINQ
- Экспорт интерфейса OData
- Используется в службах отчетов (не очень важно)
Все это должно быть сделано без каких-либо изменений в базе данных, т.е. без представлений, SP и т. Д.
Я провел несколько экспериментов с Linq2Sql, которые, кажется, работают довольно хорошо.
С помощью sqlmetal и некоторой магии регулярных выражений я создаю объекты, которые выглядят так:
[Column(Name="Quantity", CanBeNull = true, DbType="Int")]
private int? _Quantity;
...
[Column(Storage = "_Quantity", DbType = "Int")]
public int Quantity {
get { return _Quantity ?? 0; }
set { _Quantity = value; }
}
и затем я вручную добавляю необходимые свойства навигации.
К сожалению, похоже, что инвестировать в linq2sql сейчас плохо. Если я хочу OData, мне нужно пойти с сущности. Проблема в том, что структура сущностей не будет работать вообще, если у таблиц нет первичного ключа (и все поля допускают ноль, поэтому конструктор просто показывает сообщения об ошибках в модели)
Есть идеи, как это сделать?
Я понимаю, что это не будет автоматически, и я готов потратить некоторое время на разработку инструментов и ручное редактирование некоторых вещей. Схема базы данных стабильна, и изменения включают в себя только новые столбцы и таблицы (то есть никаких удалений, изменений имен или типов)