Скажите Entity Framework использовать имя «Children» вместо «InverseParent» при создании объектов - PullRequest
0 голосов
/ 29 июня 2018

Мы используем Entity Framework Core для большого проекта с дизайном на основе базы данных. Мы используем команду «scaffold» для генерации сущностей из базы данных. Другими словами, мы делаем что-то подобное в менеджере пакетов NuGet:

Scaffold-DbContext "Server=foo;Database=bar;" Microsoft.EntityFrameworkCore.SqlServer -Context Fubar -Force

В общем, это замечательная работа по созданию классов сущностей для нас.

Но есть одно раздражение. У Microsoft есть нечто, называемое InverseProperty Attribute для обозначения обратных связей. Таким образом, если у вас есть таблица SQL типа Node, с ParentId, указывающей на ту же таблицу, сгенерированный код выглядит так:

public class Node {
    public Guid ParentId { get; set; }
    public Node Parent { get; set; }
    public ICollection<Node> InverseParent { get; set; } // the name is annoying
} 

Я понимаю, почему Microsoft здесь нужна конвенция. Они не знают, какими будут имена свойств, и им нужен способ инвертировать их при создании соответствующих свойств навигации.

Но на практике для нас свойство, которое становится инвертированным, - Parent. И поэтому время от времени мы видим InverseParent, InverseParentFoo и тому подобное. Было бы значительно лучше, если бы сгенерированные имена были Children, ChildFoos и т. Д.

Мы регенерируем наши сущности довольно часто. Если бы выбор был между введением инструмента и жизнью с глупым именем, мы, вероятно, решили бы жить с глупым именем.

Есть предложения по изменению сгенерированного имени?

1 Ответ

0 голосов
/ 09 июня 2019

Принимая советы @ GraemeMiller, вот мой сценарий PowerShell. Он также запускает скаффолдинг, поэтому вам не нужно запускать несколько команд.

$connectionString = "your connection string"
$efProject= "your ef project name, also used a folder path for this script"

dotnet ef dbcontext scaffold $connectionString Microsoft.EntityFrameworkCore.SqlServer --context "MyContext" --force --project $efProject --data-annotations

foreach ($file in Get-ChildItem -Path $efProject *.cs) {
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace "InverseParent", "Children" } |
    Set-Content $file.PSPath
}
...