Измените шаблон Entity Framework, чтобы включить атрибуты анализа значений ReSharper в свойствах объекта

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

В другом месте в моем коде я использую JetBrains.Annotations чтобы показать, где пустые значения разрешены, а где нет. Например:

[NotNull]
public string Thing([CanBeNull] string s)
{
    return s ?? "Was null";
}

Как я могу заставить Entity Framework генерировать код, который включает эти атрибуты анализа значений?

Я использую Entity Framework 5.0 через DbContext,

1 ответ

Решение

В обозревателе решений под вашим .edmx файл там будет .tt файл с тем же именем, что и файл EDMX (не .Context.tt один). Откройте этот файл для редактирования.

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

Вокруг строки 23 вы увидите код, который запускает новый файл. Измените это, чтобы испустить using объявление:

    fileManager.StartNewFile(entity.Name + ".cs");
#>
using JetBrains.Annotations;

<#
    BeginNamespace(code);

Затем около строки 73 вы увидите цикл foreach, который генерирует код для свойств. Измените его так, чтобы он напоминал:

        foreach (var edmProperty in simpleProperties)
        {
            if (edmProperty.TypeUsage.Facets["Nullable"].Value.ToString() == "False")
            {
#>
    [NotNull]
<#
            }
            else
            {
#>
    [CanBeNull]
<#
            }
#>
    <#=codeStringGenerator.Property(edmProperty)#>
<#
        }

Сохраните файл и вашу сущность .cs файлы будут восстановлены. Откройте их, чтобы проверить, что они правильно компилируются. Возможно, вам придется добавить ссылку на JetBrains.Annotations.dll или где бы вы ни хранили эти определения классов атрибутов.

Это положит [NotNull] на типах значений, которые не имеют смысла, но также не вызывают проблем. Если кто-то знает больше о модели, поддерживающей шаблоны, и может предложить дальнейшее улучшение, мне было бы интересно узнать об этом.

Другие вопросы по тегам