При определении того, какое свойство в отображении EF через Fluent API следует игнорировать, создается исключение ArgumentException - PullRequest
0 голосов
/ 19 мая 2019

Я создал сопоставление в Entity Framework через Свободный API , но при определении того, что подчиненное свойство должно игнорироваться, генерируется исключение ниже:

System.ArgumentException: 'Выражение' x => x.PaisCompleto.Descricao 'не является допустимым выражением свойства. Выражение должно представлять простой доступ к свойству: 't => t.MyProperty ''

Mapeamento

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDesignTimeDbContextFactory<ApplicationDbContext>
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.ApplyConfiguration(new EnderecoMap());
    }
}

public class EnderecoMap : IEntityTypeConfiguration<Endereco>
{
    public void Configure(EntityTypeBuilder<Endereco> builder)
    {
        builder
            .OwnsOne(g => g.PaisCompleto, pais => {

                pais
                    .Property(c => c.Codigo)
                    .HasColumnName("PaisCodigo")
                    .HasColumnType("varchar(5)");
            });
        builder.Ignore(x => x.PaisCompleto.Descricao);// throw exception

        builder
            .OwnsOne(g => g.CidadeCompleto, cidade => {

                cidade
                    .Property(c => c.Codigo)
                    .HasColumnName("CidadeCodigo")
                    .HasColumnType("varchar(7)");
            });
        builder.Ignore(x => x.CidadeCompleto.Descricao);// throw exception
    }    
}

Entidades Mapeadas

public abstract class Endereco
{
    public DtoConceito<string> CidadeCompleto { get; set; }
    public string CEP { get; set; }
}

public class DtoConceito<T>
{    
    public T Codigo { get; set; }
    public string Descricao { get; set; }
}

1 Ответ

0 голосов
/ 20 мая 2019

Отношения в сущности должны отражать только сущности, а не DTO или не-сущностные классы.Если вы действительно хотите, чтобы класс не-сущности ссылался в сущности, тогда вся ссылка не-сущности должна быть помечена как NotMapped.

EF поддерживает наследование, но я бы избегал этого, если в этом нет необходимости.AFAIK Поддержка в EF Core все еще несколько ограничена на основе табличных структур, которые вы можете использовать с ней.

public class Endereco
{
    public virtual Conceito CidadeCompleto { get; set; }
    public string CEP { get; set; }
}

// If Conceito is a table...
public class Conceito
{    
    [Key]
    public string Codigo { get; set; }
    public string Descricao { get; set; }
}

, а затем сопоставьте Conceito ...

    builder
        .OwnsOne(g => g.CidadeCompleto)
        .WithOne()
        .HasForgeignKey("CidadeCodigo"); // Shadow property for the FK Code.

Это предполагает, что Enderecoимеет FK с именем "CidadeCompleto", который указывает на таблицу CidadeCodigo.

Если Endereco имеет строку для CidadeCompleto, у которой нет вспомогательной таблицы, или является частью отдельной справочной таблицы без прямого FK ивы просто хотите, чтобы конкретный DTO представлял этот код и описание, загружаемое отдельно, тогда я бы порекомендовал, чтобы сущность отобразила столбец, который там находится, и управлял ссылкой DTO отдельно в модели представления, а не в сущности.

Когда вы загружаете Endereco и хотите передать DTO для связанного значения поиска (Code + Description), используйте код CidadeCompleto, чтобы найти соответствующий DTO и заполнить его в модели представления для представления, для которого требуется код и описание.Сущность должна отражать данные в том виде, как они есть в базе данных.Модели представления и DTO отражают то, что вы хотите, чтобы представление / потребитель увидели.Старайтесь разделять эти две проблемы, а не смешивать поля и структуры вида с представлением данных.

...