Code-First Fluent API with complex classes in ASP.NET Core 2.1

0

Error while performing Add-Migration when using ComplexType classes.

public class Cliente : EntityBase
{
    public Cliente()
    {
        #region Create HashSet Properties Lists Dependences

        Titulares = new HashSet<ClienteCoTitular>();
        CoTitulares = new HashSet<ClienteCoTitular>();
        Representantes = new HashSet<ClienteRepresentante>();
        Representados = new HashSet<ClienteRepresentante>();
        CartoesAdicional = new HashSet<ClienteCartaoAdicional>();
        Cartoes = new HashSet<ClienteCartao>();
        Ofertas = new HashSet<ClienteOferta>();            
        PacotesServicos = new HashSet<ClientePacoteServico>();
        Tarifas = new HashSet<ClienteTarifa>();
        ProdutosLimites = new HashSet<ClienteProdutoLimite>();
        RendasComplementar = new HashSet<ClienteRendaComplementar>();
        ContasTerceiros = new HashSet<ClienteContaTerceiros>();
        SituacoesDadosCadastrais = new HashSet<ClienteSituacaoDadosCadastrais>();
        Etapas = new HashSet<ClienteEtapa>();
        Esteiras = new HashSet<ClienteEsteiraParametros>();
        Enderecos = new HashSet<ClienteEndereco>();
        Respostas = new HashSet<ClienteResposta>();
        Perguntas = new HashSet<ClientePergunta>();            
        RendasComplementar = new HashSet<ClienteRendaComplementar>();
        TokensAcesso = new HashSet<TokenAcesso>();
        ResidenciasFiscalExterior = new HashSet<ClienteResidenciaFiscalExterior>();
        PessoasAutorizadaMovConta = new HashSet<ClientePessoaAutorizadaMovConta>();

        #endregion
    }

    #region Properties 

    public long ClienteId { get; set; }        
    public string NivelVinculoOrganizacaoSafra { get; set; }
    public string NumeroRegistroGerente { get; set; }
    public DateTime DataAberturaConta { get; set; }

    #endregion

    #region Properties ComplexTypes

    public Filiacao Filiacao { get; set; }
    public Dependentes Dependentes { get; set; }
    public DadosPessoal DadosPessoal { get; set; }
    public Contato Contato { get; set; }
    public Conjugue Conjugue { get; set; }
    public Profissao Profissao { get; set; }
    public ContaCorrente ContaCorrente { get; set; }
    public DocumentosAnexos DocumentosAnexos { get; set; }
    public Renda Renda { get; set; }
    public Patrimonio Patrimonio { get; set; }

    #endregion

    #region Properties Indicadores S/N

    public bool IndicadorResidenciaFiscalExterior { get; set; }        
    public bool IndicadorPoliticamenteExposta { get; set; }
    public bool IndicadorOperaPorContaDeTerceiros { get; set; }
    public bool IndicadorVinculadaOrganizacaoesSafra { get; set; }                
    public bool IndicadorAutorizaPessoasMovConta { get; set; }

    #endregion

    #region Properties Relations Foreign Keys

    public long DocumentoId { get; set; }
    public virtual Documento Documento { get; set; }

    #endregion

    #region Properties Enums Identificadores

    public Enums.IdentificadorPAC IdentificadorPAC { get; set; }
    public Enums.IdentificadorConta IdentificadorConta { get; set; }        
    public Enums.IdentificadorGenero IdentificadorGenero { get; set; }        
    public Enums.IdentificadorEstadoCivil IdentificadorEstadoCivil { get; set; }
    public Enums.IdentificadorTitularidade IdentificadorTitularidade { get; set; }
    public Enums.IdentificadorEscolaridade IdentificadorEscolaridade { get; set; }
    public Enums.IdentificadorTipoClienteConta IdentificadorClienteConta { get; set; }
    public Enums.IdentificadorSegmentoCliente IdentificadorSegmentoCliente { get; set; }                
    public Enums.IdentificadorCapacidadeCivil IdentificadorCapacidadeCivil { get; set; }
    public Enums.IdentificadorModalidadeConta IdentificadorModalidadeConta { get; set; }
    public Enums.IdentificadorTipoClienteConta IdentificadorTipoClienteConta { get; set; }        
    public Enums.IdentificadorTitularidadeConta IdentificadorTitularidadeConta { get; set; }        
    public Enums.IdentificadorStatusCadastroCliente IdentificadorStatusCadastro { get; set; }
    public Enums.IdentificadorPropositoNaturezaRelacaoNegocioBanco IdentificadorPropositoNaturezaRelacaoNegocioBanco { get; set; }
    #endregion

    #region Properties Lists Dependences

    public virtual ICollection<ClienteCoTitular> Titulares { get; set; }
    public virtual ICollection<ClienteCoTitular> CoTitulares { get; set; }
    public virtual ICollection<ClienteRepresentante> Representantes { get; set; }        
    public virtual ICollection<ClienteRepresentante> Representados { get; set; }
    public virtual ICollection<ClienteCartaoAdicional> CartoesAdicional { get; set; }
    public virtual ICollection<ClienteCartao> Cartoes { get; set; }
    public virtual ICollection<ClienteOferta> Ofertas { get; set; }
    public virtual ICollection<ClienteTarifa> Tarifas { get; set; }
    public virtual ICollection<ClientePacoteServico> PacotesServicos { get; set; }
    public virtual ICollection<ClienteProdutoLimite> ProdutosLimites { get; set; }        
    public virtual ICollection<ClienteContaTerceiros> ContasTerceiros { get; set; }
    public virtual ICollection<ClienteSituacaoDadosCadastrais> SituacoesDadosCadastrais { get; set; }
    public virtual ICollection<ClienteEtapa> Etapas { get; set; }
    public virtual ICollection<ClienteEsteiraParametros> Esteiras { get; set; }
    public virtual ICollection<ClienteEndereco> Enderecos { get; set; }
    public virtual ICollection<ClienteResposta> Respostas { get; set; }        
    public virtual ICollection<ClientePergunta> Perguntas { get; set; }
    public virtual ICollection<ClienteRendaComplementar> RendasComplementar { get; set; }
    public virtual ICollection<TokenAcesso> TokensAcesso { get; set; }
    public virtual ICollection<ClienteResidenciaFiscalExterior> ResidenciasFiscalExterior { get; set; }
    public virtual ICollection<ClientePessoaAutorizadaMovConta> PessoasAutorizadaMovConta { get; set; }

    #endregion
}
  

One of the ComplexType classes used in the Client class

[ComplexType]
public class DadosPessoais
{
    public string NumeroCpf { get; set; }
    public string NomeCompleto { get; set; }
    public DateTime DataNascimento { get; set; }
    public string LocalNascimento { get; set; }
    public string Nacionalidade { get; set; }
}
  

Fluent API - Mapping

public class ClienteMap : EntityTypeConfigurationBase<Cliente>
{
    public override EntityTypeBuilder<Cliente> Config { get; set; }

    public override void Configure(EntityTypeBuilder<Cliente> builder)
    {
        base.Configure(builder);
    }

    public override void ConfiguraPrimaryKey()
    {
        Config.HasKey(x => x.ClienteId);

        Config.Property(x => x.ClienteId)
            .UseSqlServerIdentityColumn();
    }

    public override void ConfiguraProperties()
    {
        Config.OwnsOne(x => x.DadosPessoal, action =>
        {
            action.Property(p => p.NomeCompleto)
                .HasMaxLength(150)
                .IsRequired();

            action.Property(p => p.NumeroCpf)
                .HasMaxLength(11)
                .IsRequired();

            action.Property(p => p.DataNascimento)
                .HasColumnType("DATE")
                .IsRequired();

            action.Property(p => p.LocalNascimento)
                .HasMaxLength(100);

            action.Property(p => p.Nacionalidade)
                .HasMaxLength(100);                
        });

        Config.OwnsOne(x => x.Contato, action =>
        {
            action.Property(x => x.Celular)
                .HasMaxLength(15)
                .IsRequired();

            action.Property(x => x.Email)
                .HasMaxLength(150);

            action.Property(x => x.TelefoneFixo)
                .HasMaxLength(15);
        });

        Config.OwnsOne(x => x.Filiacao, action =>
        {
            action.Property(x => x.NomeCompletoMae)
                .HasMaxLength(150);

            action.Property(x => x.NomeCompletoPai)
                .HasMaxLength(150);
        });

        Config.OwnsOne(x => x.Conjugue, action =>
        {
            action.Property(x => x.NomeCompleto)
                .HasMaxLength(150);

            action.Property(x => x.NumeroCpf)
                .HasMaxLength(11);
        });

        Config.OwnsOne(x => x.Dependentes, action =>
        {
            action.Property(x => x.IndicadorDependentes)
                .HasConversion(this.ConverterIndicador)
                .HasColumnType(this.TypeChar)
                .HasDefaultValue(false);

            action.Property(x => x.NumeroDependentes)
                .HasDefaultValue(0);
        });

        Config.OwnsOne(x => x.Profissao, action =>
        {
            action.Property(x => x.DescricaoProfissao)
                .HasMaxLength(100);

            action.Property(x => x.NomeEmpresa)
                .HasMaxLength(150);

            action.Property(x => x.CnpjEmpresa)
                .HasMaxLength(14);

            action.Property(x => x.DataAdmissao)
                .HasColumnType("DATE");

            action.Property(x => x.DescricaoCargo)
                .HasMaxLength(100);

            action.Property(x => x.IdentificadorNaturezaOcupacao);
        });

        Config.OwnsOne(x => x.Renda, action =>
        {
            action.Property(x => x.ValorRendaMensal)
                .HasDefaultValue(0);

            action.Property(x => x.IndicadorRendaComprovada)
                .HasDefaultValue(Enums.IndicadorRendaComprovada.Nao);

            action.Property(x => x.IdentificadorOrigemRendaPrincipal)
                .HasDefaultValue(Enums.IdentificadorOrigemRendaPrincipal.Salario);
        });

        Config.OwnsOne(x => x.Patrimonio, action =>
        {
            action.Property(x => x.ValorPatrimonio)
                .HasDefaultValue(0);

            action.Property(x => x.IndicadorPatrimonioComImoveis)
              .HasConversion(this.ConverterIndicador)
              .HasColumnType(this.TypeChar)
              .HasDefaultValue(false);

            action.Property(x => x.PercentualPatrimonioComImoveis)
                .HasDefaultValue(0);
        });

        Config.Property(x => x.IndicadorResidenciaFiscalExterior)
            .HasConversion(this.ConverterIndicador)
            .HasColumnType(this.TypeChar)
            .HasDefaultValue(false);

        Config.Property(x => x.IndicadorPoliticamenteExposta)
            .HasConversion(this.ConverterIndicador)
            .HasColumnType(this.TypeChar)
            .HasDefaultValue(false);

        Config.Property(x => x.IndicadorOperaPorContaDeTerceiros)
            .HasConversion(this.ConverterIndicador)
            .HasColumnType(this.TypeChar)
            .HasDefaultValue(false);

        Config.Property(x => x.IndicadorVinculadaOrganizacaoesSafra)
            .HasConversion(this.ConverterIndicador)
            .HasColumnType(this.TypeChar)
            .HasDefaultValue(false);

        Config.Property(x => x.IndicadorAutorizaPessoasMovConta)
            .HasConversion(this.ConverterIndicador)
            .HasColumnType(this.TypeChar)
            .HasDefaultValue(false);

        Config.Property(x => x.NivelVinculoOrganizacaoSafra)
            .HasMaxLength(100);

        Config.Property(x => x.NumeroRegistroGerente)
            .HasMaxLength(10);

        Config.Property(x => x.DataAberturaConta)
            .HasDefaultValue(DateTime.Now)
            .IsRequired();

        Config.OwnsOne(x => x.ContaCorrente, action =>
        {
            action.Property(x => x.NumeroAgencia);

            action.Property(x => x.NumeroContaCorrente);
        });

        Config.OwnsOne(x => x.DocumentosAnexos, action =>
        {
            action.Property(x => x.ArquivoDocumentoIdentificacao);

            action.Property(x => x.ArquivoDocumentoComprovanteRenda);

            action.Property(x => x.ArquivoDocumentoComprovanteResidencia);
        });

        Config.Property(x => x.IdentificadorGenero)
           .HasConversion(this.ConverterGenero)
           .HasDefaultValue(Enums.IdentificadorGenero.Masculino);

        Config.Property(x => x.IdentificadorStatusCadastro)
            .HasDefaultValue(Enums.IdentificadorStatusCadastroCliente.Pendente)
            .IsRequired();

        Config.Property(x => x.IdentificadorTitularidade)               
           .IsRequired();

        Config.Property(x => x.IdentificadorPAC)
           .HasDefaultValue(Enums.IdentificadorPAC.Pac2250)
           .IsRequired();

        Config.Property(x => x.IdentificadorConta)
           .HasDefaultValue(Enums.IdentificadorConta.ContaCorrente)
           .IsRequired();

        Config.Property(x => x.IdentificadorSegmentoCliente)
           .HasDefaultValue(Enums.IdentificadorSegmentoCliente.Private)
           .IsRequired();

        Config.Property(x => x.IdentificadorEscolaridade)
           .HasDefaultValue(Enums.IdentificadorEscolaridade.SemEscolaridade)
           .IsRequired();

        Config.Property(x => x.IdentificadorCapacidadeCivil)
           .HasDefaultValue(Enums.IdentificadorCapacidadeCivil.Maior)
           .IsRequired();

        Config.Property(x => x.IdentificadorEstadoCivil)
           .HasDefaultValue(Enums.IdentificadorEstadoCivil.Solteiro)
           .IsRequired();

        Config.Property(x => x.IdentificadorTipoClienteConta)
           .HasDefaultValue(Enums.IdentificadorTipoClienteConta.Normal)
           .IsRequired();

        Config.Property(x => x.IdentificadorModalidadeConta)
           .HasDefaultValue(Enums.IdentificadorModalidadeConta.E_MovimentacaoIsolada)
           .IsRequired();

        Config.Property(x => x.IdentificadorTitularidadeConta)
           .HasDefaultValue(Enums.IdentificadorTitularidadeConta.Individual)
           .IsRequired();

        Config.Property(x => x.IdentificadorPropositoNaturezaRelacaoNegocioBanco)
           .HasDefaultValue(Enums.IdentificadorPropositoNaturezaRelacaoNegocioBanco.MovimentacoesFinanceirasOuContratacaoDeServicosEProdutosOuCreditos)
           .IsRequired();
    }

    public override void ConfiguraTable()
    {
        Config.ToTable("Cliente");            
    }

    public override void ConfiguraUniqueKeys()
    {
        //Config.HasAlternateKey(x => new { x.DadosPessoal.NumeroCpf, x.IdentificadorTitularidade });
    }

    public override void ConfigureHasData()
    {
        Config.HasData(
            new Cliente()
            {
                ClienteId = 1,
                NivelVinculoOrganizacaoSafra = "Basico",
                NumeroRegistroGerente = "458250",
                DataAberturaConta = DateTime.Now,
                DadosPessoal = new Entities.Entidades.ComplexType.DadosPessoais()
                {
                    NomeCompleto = "Nicola Bogar Uccio",
                    NumeroCpf = "36975780812",
                    DataNascimento = new DateTime(1988, 08, 24).Date,
                    LocalNascimento = "Guararapes",
                    Nacionalidade = "Brasileiro",
                },
                Contato = new Entities.Entidades.ComplexType.Contato()
                {
                    Email = "[email protected]",
                    Celular = "55018996716020",
                    TelefoneFixo = "5501834061203",
                },
                Filiacao = new Entities.Entidades.ComplexType.Filiacao()
                {
                    NomeCompletoMae = "Antonia Bogar",
                    NomeCompletoPai = "Wagner Uccio",
                },
                Dependentes = new Entities.Entidades.ComplexType.Dependentes()
                {
                    IndicadorDependentes = false,
                    NumeroDependentes = 0,
                },
                Profissao = new Entities.Entidades.ComplexType.Profissao()
                {
                    DescricaoProfissao = "Analista de Sistemas",
                    IdentificadorNaturezaOcupacao = Enums.IdentificadorNaturezaOcupacao.FuncionarioEmpresaPrivada,
                    DataAdmissao = new DateTime(2018, 07, 02),
                    NomeEmpresa = "Banco Safra",
                    CnpjEmpresa = "123456789",
                    DescricaoCargo = "Analista de Sistemas",
                },
                Renda = new Entities.Entidades.ComplexType.Renda()
                {
                    ValorRendaMensal = 12000.00,
                    IdentificadorOrigemRendaPrincipal = Enums.IdentificadorOrigemRendaPrincipal.Salario,
                    IndicadorRendaComprovada = Enums.IndicadorRendaComprovada.Sim,
                },
                Patrimonio = new Entities.Entidades.ComplexType.Patrimonio()
                {
                    ValorPatrimonio = 12121121.23,
                    IndicadorPatrimonioComImoveis = false,
                    PercentualPatrimonioComImoveis = 10,
                },
                ContaCorrente = new Entities.Entidades.ComplexType.ContaCorrente()
                {
                    NumeroAgencia = 1425,
                    NumeroContaCorrente = 2020203,
                },
                DocumentoId = 2,
                IndicadorResidenciaFiscalExterior = true,
                IndicadorPoliticamenteExposta = false,
                IndicadorOperaPorContaDeTerceiros = true,
                IndicadorVinculadaOrganizacaoesSafra = false,                    
                IndicadorAutorizaPessoasMovConta = true,
                IdentificadorPropositoNaturezaRelacaoNegocioBanco = Enums.IdentificadorPropositoNaturezaRelacaoNegocioBanco.MovimentacoesFinanceirasOuContratacaoDeServicosEProdutosOuCreditos,
                IdentificadorSegmentoCliente = Enums.IdentificadorSegmentoCliente.Private,
                IdentificadorCapacidadeCivil = Enums.IdentificadorCapacidadeCivil.Maior,
                IdentificadorEstadoCivil = Enums.IdentificadorEstadoCivil.Solteiro,
                IdentificadorEscolaridade = Enums.IdentificadorEscolaridade.Superior,                    
                IdentificadorConta = Enums.IdentificadorConta.ContaCorrente,
                IdentificadorTipoClienteConta = Enums.IdentificadorTipoClienteConta.Normal,
                IdentificadorTitularidadeConta = Enums.IdentificadorTitularidadeConta.Individual,
                IdentificadorModalidadeConta =  Enums.IdentificadorModalidadeConta.E_MovimentacaoIsolada,
                IdentificadorPAC = Enums.IdentificadorPAC.Pac4480,
                IdentificadorStatusCadastro = Enums.IdentificadorStatusCadastroCliente.Pendente,
                IdentificadorTitularidade = Enums.IdentificadorTitularidade.Titular
            },
            new Cliente()
            {
                ClienteId = 1,
                NivelVinculoOrganizacaoSafra = "Basico",
                NumeroRegistroGerente = "458250",
                DataAberturaConta = DateTime.Now,
                DadosPessoal = new Entities.Entidades.ComplexType.DadosPessoais()
                {
                    NomeCompleto = "Corina Bogar Uccio",
                    NumeroCpf = "36975780816",
                    DataNascimento = new DateTime(1988, 02, 03).Date,
                    LocalNascimento = "Guararapes",
                    Nacionalidade = "Brasileiro",
                },
                Contato = new Entities.Entidades.ComplexType.Contato()
                {
                    Email = "[email protected]",
                    Celular = "55018996716020",
                    TelefoneFixo = "5501834061203",
                },
                Filiacao = new Entities.Entidades.ComplexType.Filiacao()
                {
                    NomeCompletoMae = "Antonia Bogar",
                    NomeCompletoPai = "Wagner Uccio",
                },
                Dependentes = new Entities.Entidades.ComplexType.Dependentes()
                {
                    IndicadorDependentes = false,
                    NumeroDependentes = 0,
                },
                Profissao = new Entities.Entidades.ComplexType.Profissao()
                {
                    DescricaoProfissao = "Analista de Sistemas",
                    IdentificadorNaturezaOcupacao = Enums.IdentificadorNaturezaOcupacao.FuncionarioEmpresaPrivada,
                    DataAdmissao = new DateTime(2018, 07, 02),
                    NomeEmpresa = "Banco Safra",
                    CnpjEmpresa = "123456789",
                    DescricaoCargo = "Analista de Sistemas",
                },
                Renda = new Entities.Entidades.ComplexType.Renda()
                {
                    ValorRendaMensal = 12000.00,
                    IdentificadorOrigemRendaPrincipal = Enums.IdentificadorOrigemRendaPrincipal.Salario,
                    IndicadorRendaComprovada = Enums.IndicadorRendaComprovada.Sim,
                },
                Patrimonio = new Entities.Entidades.ComplexType.Patrimonio()
                {
                    ValorPatrimonio = 12121121.23,
                    IndicadorPatrimonioComImoveis = false,
                    PercentualPatrimonioComImoveis = 10,
                },
                ContaCorrente = new Entities.Entidades.ComplexType.ContaCorrente()
                {
                    NumeroAgencia = 1425,
                    NumeroContaCorrente = 2020203,
                },
                DocumentoId = 1,
                IndicadorResidenciaFiscalExterior = true,
                IndicadorPoliticamenteExposta = false,
                IndicadorOperaPorContaDeTerceiros = true,
                IndicadorVinculadaOrganizacaoesSafra = false,
                IndicadorAutorizaPessoasMovConta = true,
                IdentificadorPropositoNaturezaRelacaoNegocioBanco = Enums.IdentificadorPropositoNaturezaRelacaoNegocioBanco.MovimentacoesFinanceirasOuContratacaoDeServicosEProdutosOuCreditos,
                IdentificadorSegmentoCliente = Enums.IdentificadorSegmentoCliente.Private,
                IdentificadorCapacidadeCivil = Enums.IdentificadorCapacidadeCivil.Maior,
                IdentificadorEstadoCivil = Enums.IdentificadorEstadoCivil.Solteiro,
                IdentificadorEscolaridade = Enums.IdentificadorEscolaridade.Superior,
                IdentificadorConta = Enums.IdentificadorConta.ContaCorrente,
                IdentificadorTipoClienteConta = Enums.IdentificadorTipoClienteConta.Normal,
                IdentificadorTitularidadeConta = Enums.IdentificadorTitularidadeConta.Individual,
                IdentificadorModalidadeConta = Enums.IdentificadorModalidadeConta.E_MovimentacaoIsolada,
                IdentificadorPAC = Enums.IdentificadorPAC.Pac2250,
                IdentificadorStatusCadastro = Enums.IdentificadorStatusCadastroCliente.Pendente,
                IdentificadorTitularidade = Enums.IdentificadorTitularidade.CoTitular
            }
            );
    }

    public override void ConfigureManyToMany()
    {

    }

    public override void ConfigureOneToMany()
    {
        Config.HasOne(x => x.Documento)
            .WithMany()
            .HasForeignKey(x => x.DocumentoId);
    }

    public override void ConfigureOneToOne()
    {

    }

    public override void ConfigureManyToOne()
    {
        Config.HasOne(x => x.Documento)
            .WithMany()
            .HasForeignKey(x => x.DocumentoId)
            .OnDelete(DeleteBehavior.Restrict)
            .IsRequired();            
    }
}
  

Error performing migration: The properties expression 'x = > new < > f__AnonymousType6'2 (ClientId = x.Indicator, NumberCpf = xPersonalData.CpfNumber) 'is not valid. The expression should represent a simple property access: 't = > t.MyProperty '. When specifying multiple properties use an anonymous type: 't = > new {t.MyProperty1, t.MyProperty2} '. Parameter name: propertyAccessExpression

    
asked by anonymous 15.08.2018 / 19:02

2 answers

0

The code provided was useless, but as far as the exception says, the problem is that you have specified names in the anonymous type ( x => new { ClienteId = x.ClienteId, NumeroCpf = x.DadosPessoal.NumeroCpf } ), rather than simply providing the properties, without assignments ( x => new { x.ClienteId, x.DadosPessoal.NumeroCpf } )

    
15.08.2018 / 22:47
0

I solved my problem as follows:

  

In complex class instead of using [ComplexType] I used [Owned]

[Owned]
public class DadosPessoais
{        
    public string NumeroCpf { get; set; }
    public string NomeCompleto { get; set; }
    public DateTime DataNascimento { get; set; }
    public string LocalNascimento { get; set; }
    public string Nacionalidade { get; set; }
}
  

Client class using the class decorated with [Owned]

public class Cliente
{
    public virtual DadosPessoais DadosPessoais { get; set; }
}
  

When doing the migration I'm 'Mounting values in the table to perform tests', in this case I have to use .HasData()

        modelBuilder.OwnsOne(x => x.DadosPessoais, action =>
        {
            action.Property(p => p.NomeCompleto)
                .HasMaxLength(150)
                .IsRequired();

            action.Property(p => p.NumeroCpf)
                .HasMaxLength(11)
                .IsRequired();

            action.Property(p => p.DataNascimento)
                .HasColumnType("DATE")
                .IsRequired();

            action.Property(p => p.LocalNascimento)
                .HasMaxLength(100);

            action.Property(p => p.Nacionalidade)
                .HasMaxLength(100);

            action.HasData(
                    new 
                    {
                        ClienteId = (long)1,
                        NomeCompleto = "Nicola Bogar Uccio",
                        NumeroCpf = "36975780812",
                        DataNascimento = new DateTime(1988, 08, 24).Date,
                        LocalNascimento = "Guararapes",
                        Nacionalidade = "Brasileiro",
                    },
                    new 
                    {
                        ClienteId = (long)2,
                        NomeCompleto = "Corina Bogar Uccio",
                        NumeroCpf = "36975780816",
                        DataNascimento = new DateTime(1988, 02, 03).Date,
                        LocalNascimento = "Guararapes",
                        Nacionalidade = "Brasileiro",
                    }
                );
        });
  

I was doing it this way:

   modelBuilder.HasData(
            new Cliente()
            {
                ClienteId = 1,
                DadosPessoais = new Entities.Entidades.ComplexType.DadosPessoais()
                {
                    NumeroCpf = "12345678",
                    DataNascimento = DateTime.Now,
                    LocalNascimento = "Teste",
                    Nacionalidade = "Teste",
                    NomeCompleto = "Teste"
                }
            }
  

Where it is right to create the HasData of the client class without informing the complex classes, and when configuring the complex class in OwnsOne, create the complex class HasData and bind the client class relationship to the complex class, as follows:

modelBuilder.HasData(
     new Cliente()
     {
         ClienteId = 1
     }


Config.OwnsOne(x => x.DadosPessoais, action =>
        {
            action.Property(p => p.NomeCompleto)
                .HasMaxLength(150)
                .IsRequired();

            action.Property(p => p.NumeroCpf)
                .HasMaxLength(11)
                .IsRequired();

            action.Property(p => p.DataNascimento)
                .HasColumnType("DATE")
                .IsRequired();

            action.Property(p => p.LocalNascimento)
                .HasMaxLength(100);

            action.Property(p => p.Nacionalidade)
                .HasMaxLength(100);

            action.HasData(
                    new 
                    {
                        ClienteId = (long)1,
                        NomeCompleto = "Nicola Bogar Uccio",
                        NumeroCpf = "36975780812",
                        DataNascimento = new DateTime(1988, 08, 24).Date,
                        LocalNascimento = "Guararapes",
                        Nacionalidade = "Brasileiro",
                    },
                    new 
                    {
                        ClienteId = (long)2,
                        NomeCompleto = "Corina Bogar Uccio",
                        NumeroCpf = "36975780816",
                        DataNascimento = new DateTime(1988, 02, 03).Date,
                        LocalNascimento = "Guararapes",
                        Nacionalidade = "Brasileiro",
                    }
                );
        });
    
16.08.2018 / 17:07