[Visual Studio] Автогенерация SQL-процедур по описанию модел
От: LWhisper  
Дата: 20.06.16 17:01
Оценка:
Всем привет.

В настоящий момент в проекте есть большое количество модельных объектов, которые вручную описываются сторками и функциями для хранения и поиска оных в LocalDB.
Для большинства из них набор методов довольно тривиален: Create, Update, Delete, FindById, FindAll

Хочется автоматически их генерировать вместо того, чтобы набивать руками, постоянно ошибаясь и забывая добавить новый параметр при изменении схемы таблицы.
Подскажите какой-нибудь легковестный фреймворк с абсолютно свободной лицензией или просто наилучший способ это организовать.

Пока самое примитивное решение — вынести генерацию в отдельный EXE'ик и запускать его в Pre-build проекта. Но, возможно, есть более интеллектуальные решения?
visual studio sql generate pre-build aop
Re: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: uzhas Ниоткуда  
Дата: 20.06.16 17:15
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Пока самое примитивное решение — вынести генерацию в отдельный EXE'ик и запускать его в Pre-build проекта. Но, возможно, есть более интеллектуальные решения?


мы именно так и делаем
тулзу написали на C#
1) либо придумайте некий формат описания данных, в тулзе парсите его и генерите что надо
2) либо описашите структуры в коде C#, затем их рефлекшеном помучайте. на свойства \ классы можно еще атрибуты повесить, чтобы кастомизировать генерируемый выхлоп
Re: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: Kolesiki  
Дата: 20.06.16 22:47
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Хочется автоматически их генерировать


Говорим "генерация кода" — подразумеваем Т4!
Re: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 21.06.16 09:15
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Но, возможно, есть более интеллектуальные решения?

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

Вообще я бы разбил задачу кодогенерации на несколько частей.

Задание модели
Т.е. когда в какой-то форме описывается то, на основании чего мы будем производить генерацию. В качестве источника такой модели может быть всё, что угодно:
Исходя из вот этой фразы

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

я подумал что вы за основу хотите брать изменения в базе. Честно говоря, не самый простой в реализации вариант. Или у вас другие мылсли на сей счет?

Генерация
Здесь обычно используют один из 2-х подходов: генерация на основе синтаксического дерева (или DOM), например как в CodeDOM, или просто обычные текстовые шаблоны.
Для генерации SQL, я видел решения только на основании шаблонов (конечно, DOM модели для SQL есть, например тот же T-SQL Script DOM, но использовать его для генерации... проще застрелиться, имхо).
Ну а решений на базе шаблонов — куча. Самый популярный, наверное, это T4, просто потому, что поддержка встроена в Visual Studio (а вот вне VS его не всегда удобно использовать).
Re[2]: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: LWhisper  
Дата: 21.06.16 09:37
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Генерация

МР>Здесь обычно используют один из 2-х подходов: генерация на основе синтаксического дерева (или DOM), например как в CodeDOM, или просто обычные текстовые шаблоны.
МР>Для генерации SQL, я видел решения только на основании шаблонов (конечно, DOM модели для SQL есть, например тот же T-SQL Script DOM, но использовать его для генерации... проще застрелиться, имхо).
МР>Ну а решений на базе шаблонов — куча. Самый популярный, наверное, это T4, просто потому, что поддержка встроена в Visual Studio (а вот вне VS его не всегда удобно использовать).

Все дороги идут к T4. Думаю, это правильный путь.
Re[3]: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 21.06.16 10:24
Оценка: 15 (2)
Здравствуйте, LWhisper, Вы писали:

LW>Все дороги идут к T4. Думаю, это правильный путь.


В целом, наверное, да. Как минимум — он достаточно изучен и описан, по сравнению со всем остальным.
В целом для этой цели еще используют Razor, но я не уверен на сколько там готова инфраструктура — не убъете ли вы больше времени на возню с окружением.
Однако, всё же подумайте еще раз о том, как вы будете хранить модель — исходные данные для генерации.

Ну и в целом, могу порекомендовать такие ссылки:

Ну и если у вас будет избыточно времени, можете посмотреть пару видео с доклада, который я делал на местной встрече разработчиков (качество записи — так себе) по использованию DSL Tools и T4 для схожей с вамшей задачей.
  2 части
Часть 1
Часть 2.
Re[4]: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: uzhas Ниоткуда  
Дата: 21.06.16 14:31
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>по использованию DSL Tools и T4 для схожей с вашей задачей.


круто, мне понравилась тема с DSL tools + связка с T4
даже не слышал про такие возможности
Re: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: IT Россия linq2db.com
Дата: 21.06.16 15:29
Оценка: 1 (1)
Здравствуйте, LWhisper, Вы писали:

В качестве нецелевого использования LINQ to DB.

1. Ставим LINQ to SqlServer из nuget.
2. Пишем T4

<#@ template language="C#" debug="True" hostSpecific="True"                           #>
<#@ output extension=".generated.sql"                                                 #>
<#@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.SqlServer.Tools.ttinclude" #>
<#
    LoadSqlServerMetadata(".", "AdventureWorksDW2008R2");

    foreach (var table in Tables.Values.Where(t => t.Columns.Values.Any(c => c.IsPrimaryKey)))
    {
#>
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = '<#= table.Name #>_SelectByKey')
BEGIN
    DROP Procedure <#= table.Name #>_SelectByKey
END
GO

CREATE Procedure [<#= table.TableName #>_SelectByKey]
<#
        foreach (var column in table.Columns.Values.Where(c => c.IsPrimaryKey))
        {
#>
    @<#= column.MemberName #> <#= column.ColumnType #> <#= column.IsNullable ? "NULL" : "NOT NULL" #>,
<#
        }

        GenerationEnvironment.Length -= 3;
#>

AS

SELECT
<#
        foreach (var column in table.Columns.Values)
        {
#>
    [<#= column.ColumnName #>],
<#
        }

        GenerationEnvironment.Length -= 3;
#>

FROM
    [<#= table.Name #>]
WHERE
<#
        foreach (var column in table.Columns.Values.Where(c => c.IsPrimaryKey))
        {
#>
    [<#= column.ColumnName #>] = @<#= column.MemberName #> AND
<#
        }

        GenerationEnvironment.Length -= 5;
#>


GO

<#
    }
#>
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: [Visual Studio] Автогенерация SQL-процедур по описанию модел
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 21.06.16 15:51
Оценка:
Здравствуйте, uzhas, Вы писали:

U>круто, мне понравилась тема с DSL tools + связка с T4

U>даже не слышал про такие возможности

Приятно, что смог кого-то заинтересовать.
На самом деле тема с Model Driven Architecture одно время была очень популярна. И Microsoft далеко не единственные, кто пытался её развить. У сообсщества Eclipse, есть Graphical Modeling Framework (GMF).
Но... можно честно признать, что она не взлетела.
Там много проблем, которые вылезают в реальном использовании, я вроде на последнем слайде даже их попытался обозначить (уже не помню просто).

Сама Microsoft, как я понимаю, более DSL Tools не развивает (точнее направление Modeling у них осталось, но там больше ориентация на UML и инструменты вокруг него). Немного печально, но имхо, такой инструмент применим далеко не везде. Для 90% заказных проектов (которые пишутся с 0 под конкретного заказчика) — поддержка собственного DSL слишком большая роскошь. А вот для какой-нибудь бизнес-платформы, (а'ля 1С) это мог бы быть довольно удобный механизм. Но таких продуктов не так много.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.