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