Настраиваемые объекты EF Core Scaffold и DBContext

Я использую EF Core и первый подход к базе данных. Я генерирую свой dbcontext и класс сущностей, используя dotnet ef dbcontext scaffold, и это дало мне ожидаемый результат.

Затем мне нужно добавить настраиваемую реализацию в свой dbcontext и класс сущности, но всякий раз, когда я обновляю свой db и повторно формирую его, все файлы заменяются, и вся моя настраиваемая реализация также исчезает. Как сформировать как контекст, так и сущность, но с некоторой настраиваемой конфигурацией?

Вот пример того, к чему я стремлюсь

У меня BaseEntity.cs класс

public class BaseEntity
{
    public int Id { get; set; }
    public bool Deleted { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedTime { get; set; }
    public string LastModifiedBy { get; set; }
    public DateTime? LastModifiedTime { get; set; }
}

и моя сущность будет выглядеть так

public partial class Education : BaseEntity
{
    public Education()
    {
        EducationDetail = new HashSet<EducationDetail>();
    }
    public int UserProfileId { get; set; }
    public int EnumEducationId { get; set; }
    public string Description { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime? EndDate { get; set; }

    public virtual EnumEducation EnumEducation { get; set; }
    public virtual UserProfile UserProfile { get; set; }
    public virtual ICollection<EducationDetail> EducationDetail { get; set; }
}

Но если я переделаю эшафот, он станет

public partial class Education 
{
    public Education()
    {
        EducationDetail = new HashSet<EducationDetail>();
    }
    public int Id { get; set; }
    public bool Deleted { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedTime { get; set; }
    public string LastModifiedBy { get; set; }
    public DateTime? LastModifiedTime { get; set; }
    public int UserProfileId { get; set; }
    public int EnumEducationId { get; set; }
    public string Description { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime? EndDate { get; set; }

    public virtual EnumEducation EnumEducation { get; set; }
    public virtual UserProfile UserProfile { get; set; }
    public virtual ICollection<EducationDetail> EducationDetail { get; set; }
}

могу ли я изготовить подмости по индивидуальному заказу? я нашел Entity Framework Core Customize Scaffolding, но я думаю, что он больше не доступен / не поддерживается Майкрософт

В любом случае?


person hphp    schedule 15.09.2020    source источник


Ответы (1)


Опция 1

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

partial class Education : IEntity
{
}

Варианты 2

Используйте шаблоны. Это дает вам полный контроль над сгенерированным кодом. Пакет EntityFrameworkCore.Scaffolding.Handlebars включает шаблоны через руль. Пример EFCore.TextTemplating показывает, как использовать шаблоны T4.

<#@ parameter name="EntityType" type="Microsoft.EntityFrameworkCore.Metadata.IEntityType" #>
<#@ parameter name="Code" type="Microsoft.EntityFrameworkCore.Design.ICSharpHelper" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="Microsoft.EntityFrameworkCore" #>
<#
    var baseProperties = new[]
    {
        "Id",
        "Deleted",
        "CreatedBy",
        "CreatedTime",
        "LastModifiedBy",
        "LastModifiedTime"
    };
#>
public partial class <#= EntityType.Name #> : BaseEntity
{
    <# foreach (var property in EntityType.GetProperties()
        .Where(p => !baseProperties.Contains(p.Name))) { #>
        
    public <#= Code.Reference(property.ClrType) #> <#= property.Name #> { get; set; }
    
    <# } #>
}
person bricelam    schedule 21.09.2020