- PVSM.RU - https://www.pvsm.ru -
Так уж вышло, что в нашем старом ASP.NET MVC проекте модели таблиц базы данных хранились с идентичными именами, т.е. в нижнем регистре, с подчеркиваниями и пр., а DTO уже в стандарте именования .NET [1].
Это было сделано по ряду причин. Основные из них: явно задана область применения модели; удобство при построении linq запросов, когда названия таблиц и столбцов можно спокойно переносить из, к примеру, sql запроса.
К сожалению в .NET Core приложениях EDMX больше не поддерживается, а в CLI команде [2] достаточно скудный набор возможностей. Поэтому нам пришлось пойти на небольшую хитрость.
Возможно, в релизе 1.2 добавят [3] эту опцию, но пока ее нет, так что придется идти на крайние, временные меры.
Для начала создадим проект, который будет содержать все наши модели. Это будет консольное приложение .NET Core.
Почему именно Console Application, а не Class library спросите Вы. Все дело в том Entity Framework поддерживает .NET Core CLI команды только этих фреймворков:
А Class library использует netstandard, не судьба. В любом случае созданное консольное .NET Core приложение можно добавить в ASP.NET Core проект.
Не буду ходить вокруг да около, расписывать за что отвечает данный файл я думаю смысла особого нет, мы не для этого тут собрались.
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final"
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
}
}
При создании наш Program.cs выглядит примерно так:
namespace DomainModels
{
public class Program
{
public static void Main(string[] args)
{
}
}
}
Его мы и будем расширять. Так, перейдем к небольшому исследованию. Немного покопавшись в исходниках EF на GitHub я обнаружил внедрение [4] зависимости класса CandidateNamingService [5] при scaffolding. Пробежав беглым взглядом код, я понял, что он отвечает за преобразование имени сущности базы данных в формат стандарта .NET именования. И все, что нам осталось, это переопределить функцию GenerateCandidateIdentifier, чтобы она возвращала оригинальное имя сущности.
Давайте расширим наш код до такого варианта:
namespace DomainModels
{
public class Program
{
public static void Main(string[] args)
{
}
}
public class MyCandidateNamingService : CandidateNamingService
{
public override string GenerateCandidateIdentifier(string original)
{
return original;
}
}
}
Само собой вы можете поместить любую логику по вкусу в GenerateCandidateIdentifier.
Теперь необходимо внедрить зависимость с помощью AddSingleton. Но где и как это сделать? Так как CandidateNamingService относится к design-time сервисам нам необходимо определить метод ConfigureDesignTimeServices [6] в классе Program:
namespace DomainModels
{
public class Program
{
public static void Main(string[] args)
{
}
public void ConfigureDesignTimeServices(IServiceCollection services)
{
services.AddSingleton<CandidateNamingService, MyCandidateNamingService>();
}
}
public class MyCandidateNamingService : CandidateNamingService
{
public override string GenerateCandidateIdentifier(string original)
{
return original;
}
}
}
Готово! Пора выполнять генерацию моделей.
Тут я не буду вдаваться в подробности, все особенности CLI расписаны тут [7], а мы рассмотрим итоговый вариант команд без различных настроек:
dotnet restore
dotnet run
dotnet ef dbcontext scaffold 'строка-соединения-с-бд' Microsoft.EntityFrameworkCore.SqlServer
Вот собственно и все, что нужно для настройки и генерации моделей. Кстати, для более удобного scaffolding я написал небольшой PowerShell скрипт [8], вдруг кому-то пригодится.
Автор: mrxten
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/207923
Ссылки в тексте:
[1] именования .NET: https://msdn.microsoft.com/en-us/library/ms229002(v=vs.110).aspx
[2] команде: https://docs.efproject.net/en/latest/miscellaneous/cli/dotnet.html#dotnet-ef-dbcontext-scaffold
[3] добавят: https://github.com/aspnet/EntityFramework/issues/6018
[4] внедрение: https://github.com/aspnet/EntityFramework/blob/c9b5916a4e0fff763febea00da793ebd4113632d/src/Microsoft.EntityFrameworkCore.Design/Scaffolding/Internal/ScaffoldingServiceCollectionExtensions.cs#L23
[5] CandidateNamingService : https://github.com/aspnet/EntityFramework/blob/1fa247b038927a7d7438f666dc11253f64e0432d/src/Microsoft.EntityFrameworkCore.Relational.Design/Internal/CandidateNamingService.cs
[6] ConfigureDesignTimeServices: https://github.com/aspnet/EntityFramework/issues/5617
[7] тут: https://docs.efproject.net/en/latest/miscellaneous/cli/dotnet.html
[8] скрипт: https://gist.github.com/mrxten/f8ac6a7ced4b431f0e65f7ddb45fc63f
[9] Источник: https://habrahabr.ru/post/314624/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.