Вы могли бы подумать, что это будет так просто ... Однако, когда я пытаюсь изменить отображение таблицы таким образом, мне представляется только имя таблицы, которое соответствует имени объекта, и я не могу переопределить его чем-то другим ( либо уже существующая таблица в базе данных, либо новое имя таблицы в целом).

следую вопрос о замене или дополнении нашей собственной ORM-системы Entity Framework 4 и замечаю, что последняя может привести к конфликту между тем, что мы определили как соглашения об именах для нашего программного кода и наших баз данных. Будучи магазином Microsoft, мы в значительной степени решили следоватьРекомендации Microsoft по присвоению имен нашему коду, которые говорят использовать корпус Pascal для членов, пространств имен и т.д .; избегать подчеркивания и т. д.

Неудивительно, что стандартные соглашения об именах сущностей в EF4 прекрасно работают с этими стандартами. Например, сущность с именемЗаказ клиента сгенерирует класс с именемЗаказ клиента и набор сущностей с именемЗаказы на продажу, Конструкция EF4 Model-First по умолчанию создает таблицу с тем же именем, что и набор сущностей (в этом примере сгенерированное имя таблицы - SalesOrders). Тем не менее, наши стандарты базы данных предлагают использовать все строчные и подчеркивания между словами (например,заказы на продажу). Таким образом, использование Entity Framework «как есть» заставит нас начать отклоняться от них.

Есть ли где-нибудь в Entity Framework, где вы можете переопределить его поведение, чтобы использовать имя набора сущностей в качестве имени таблицы SQL? Кажется, я не могу найти очевидное место для указания альтернативного имени таблицы для сгенерированного сценария SQL. Если мы пойдем дальше с использованием EF4, является ли единственно вероятным решением заставить нас пересмотреть наши соглашения об именах баз данных?

Обновить:

Я пытаюсь найти решение Ладислава ниже, но я не могу получитьСоздать базу данных из модели опцию в конструкторе моделей Entity Framework для распознавания моей пользовательской утилиты. У меня есть файл с именемMyOrg.EF.Utility.CS.ttinclude в папке:

%VSINSTALLDIR%\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes

По сути это выглядит так:

<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>


public class CustomUtilities
{
    public static string EntityNameToSqlName(string name)
    {
        string sqlName = "";    // The table name based on the input model name
        string pattern = "([A-Z]+[s])|([A-Z](?=[a-z]))|((?<=[a-z])[A-Z])";  //Pattern for the regex exp. below

        // Separate out each word with spaces:
        sqlName = System.Text.RegularExpressions.Regex.Replace(name, pattern, " 
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>


public class CustomUtilities
{
    public static string EntityNameToSqlName(string name)
    {
        string sqlName = "";    // The table name based on the input model name
        string pattern = "([A-Z]+[s])|([A-Z](?=[a-z]))|((?<=[a-z])[A-Z])";  //Pattern for the regex exp. below

        // Separate out each word with spaces:
        sqlName = System.Text.RegularExpressions.Regex.Replace(name, pattern, " $&");

        // Replace spaces with underscores and then make lowercase:
        sqlName = sqlName.Trim().Replace(" ", "_").ToLower();

        return sqlName;
    }

}
amp;"); // Replace spaces with underscores and then make lowercase: sqlName = sqlName.Trim().Replace(" ", "_").ToLower(); return sqlName; } }

Я попытался сослаться на этот файл в моем собственном файле генерации DDL .TT вверху как таковой:

<#@ include file="MyOrg.EF.Utility.CS.ttinclude"#>

Тем не менее, если я попытаюсь сослаться на вышеупомянутую функцию, используя такой код в файле .tt:

string tableName = CustomUtilities.EntityNameToSqlName(Id(entitySet.GetTableName()));

Visual Studio потом жалуется, чтоИмя «CustomUtilities» не существует в текущем контексте, Удаление имени класса из «CustomUtilities.EntityNameToSqlName» возвращает похожую ошибку. Должен ли я попробовать другой способ вставить пользовательскую функцию в код генерации DDL?

Окончательное решение:

Я смог наконец заставить это работать после того, как понял, что не оборачиваю код C # в свойMyOrg.EF.Utility.CS.ttinclude файл с этим:

<#+
[my code]
#>

Мне также нужно было добавить публичную копиюWriteColumns () метод найден в файлеGenerateTSQL.Utility так что он будет использовать мой метод EntityNametoSqlName ().

К сожалению, моя индивидуальная версия оригиналаSSDLToSQL10.tt файл теперь немного грязный, так как мне нужно обернутьCustomUtilities.EntityNameToSqlName () вокруг немало предметов.

Ответы на вопрос(3)

Ваш ответ на вопрос