Q:

Problema com ValueObject no Entity framework

Estou tendo uma dificuldade com um mapeamento e gostaria de saber se é possível fazer isso:
Possuo uma classe de Contato com dois campos que são ValueObject do tipo "Telefone", os campos são Telefone e Celular.
public Telefone Telefone { get; set; }
public Telefone Celular { get; set; }

Gostaria de fazer o seguinte mapeamento, de forma que Telefone seja obrigatório e o celular não:
Property(x => x.Telefone.DDD)
  .HasColumnName("TelefoneDDD")
  .IsRequired();
Property(x => x.Telefone.Numero)
  .HasColumnName("Telefone")
  .IsRequired();
Property(x => x.Celular.DDD)
  .HasColumnName("CelularDDD")
  .IsOptional();
Property(x => x.Celular.Numero)
  .HasColumnName("Celular")
  .IsOptional();

Quando mando gerar o migration, me retorna o seguinte erro:

Conflicting configuration settings were specified for property 'Numero' on type 'SistemaTeste.Domain.ValueObject.Telefone': 
  IsNullable = False conflicts with IsNullable = True

A:

Você deveria ter uma configuração separada para a entidade Telefone e apenas fazer a chave para os dois campos na sua entidade principal. Em um deles vc deixa como Obrigatório e o outro não
public class Telefone
{
    public int Codigo {get;set;}
    public int DDD {get;set;}
    public string Numero {get;set;}
}

public class Cadastro
{
    public int CodigoTelefone {get;set;}
    public Telefone Telefone {get;set;}
    public int? CodigoCelular {get;set;}
    public Telefone Celular {get;set;}
}

//Mapeamento da classe Cadastro

HasRequired(c => c.Telefone)
    .WithMany()
    .HasForeignKey(c => c.CodigoTelefone)
    .WillCascadeOnDelete(true); // Telefone é obrigatório

HasOptional(c => c.Celular)
    .WithMany()
    .HasForeignKey(c => c.CodigoCelular)
    .WillCascadeOnDelete(true); // Celular não é obrigatório

