Соглашение сложного типа по имени свойства? - PullRequest
1 голос
/ 18 июня 2019

Комплексный тип

public class Timestamp
{
    public string By { get; set; }
    public DateTime? On { get; set; }
}

Требуемое сопоставление по умолчанию

Есть ли способ добавить соглашения в каркас сущностей, чтобы типы, у которых мой класс Timestamp в качестве свойства (как показано ниже), по умолчанию отображались на "CreatedBy" вместо "Created_By"? Если да, то как?

public class StationProductRun
{
    public int Id { get; set; }
    public int PlantProductRunId { get; set; }
    public int StationId { get; set; }
    public string SapProductId { get; set; }
    public Timestamp Created { get; set; }
    public Timestamp Started { get; set; }
    public Timestamp Finished { get; set; }

    public StationProductRun()
    {
        Created = new Timestamp();
        Started = new Timestamp();
        Finished = new Timestamp();
    }
}
  • Created.By => CreatedBy
  • Created.On => CreatedOn
  • Started.By => StartedBy
  • Started.On => StartedOn
  • Finished.By => FinishedBy
  • 1025 * Etc. *

Я знаю, что мог бы создать EntityTypeConfiguration<T> реализаций для каждого типа, но я устал от написания такого scaffoldable кода и ищу лучшую альтернативу.

Что я пробовал

Я попробовал следующее, но я не уверен, что даже нахожусь в приблизительном поле на этом, и он жалуется на фильтрацию свойств и тому подобное. Даже не уверен, что это делает то, что я хочу.

modelBuilder.Properties<Timestamp>()
            .Configure(x =>
            {
                if (x.ClrPropertyInfo.DeclaringType == typeof(Timestamp))
                {
                    switch (x.ClrPropertyInfo.Name)
                    {
                        case "By":
                            x.HasColumnName(x.ClrPropertyInfo.Name + "By")
                             .IsOptional();
                            return;
                        case "On":
                            x.HasColumnName(x.ClrPropertyInfo.Name + "On")
                             .IsOptional();
                            return;
                    }
                }
            });

'Тип «Отметка времени» нельзя использовать для фильтрации свойств. Поддерживаются только скалярные типы, string и byte []. '

1 Ответ

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

Это то, что я буду использовать, пока не получу ответ.Это не мое идеальное решение, но оно лучше, чем у меня сейчас.

Интерфейсы сущностей

public interface ICreated
{
    Timestamp Created { get; set; }
}

public interface IModified
{
    Timestamp Modified { get; set; }
}

Конфигурации типов сущностей

public class EntityConfigCreated<T> : EntityTypeConfiguration<T> where T : class, ICreated
{
    public EntityConfigCreated()
    {
        this.Property(x => x.Created.By)
            .HasColumnName("CreatedBy")
            .HasMaxLength(256)
            .IsOptional();

        this.Property(x => x.Created.On)
            .HasColumnName("CreatedOn")
            .IsOptional();
    }
}

public class EntityConfigModified<T> : EntityTypeConfiguration<T> where T : class, IModified
{
    public EntityConfigModified()
    {
        this.Property(x => x.Modified.By)
            .HasColumnName("ModifiedBy")
            .HasMaxLength(256)
            .IsOptional();

        this.Property(x => x.Modified.On)
            .HasColumnName("ModifiedOn")
            .IsOptional();
    }
}

public class EntityConfigCreatedModified<T> : EntityTypeConfiguration<T> where T : class, ICreated, IModified
{
    public EntityConfigCreatedModified()
    {
        this.Property(x => x.Created.By)
            .HasColumnName("CreatedBy")
            .HasMaxLength(256)
            .IsOptional();

        this.Property(x => x.Created.On)
            .HasColumnName("CreatedOn")
            .IsOptional();

        this.Property(x => x.Modified.By)
            .HasColumnName("ModifiedBy")
            .HasMaxLength(256)
            .IsOptional();

        this.Property(x => x.Modified.On)
            .HasColumnName("ModifiedOn")
            .IsOptional();
    }
}

Таким образом, мне не нужно реализовывать EntityTypeConfiguration<T> для каждого типа, только для каждой комбинации свойств отметки времени.У большинства из которых есть только Created и Modified, так что это значительное сокращение кодирования, но все же не очень хорошо, если использовать объявленное свойство в качестве схемы именования.

...