Código do Entity Framework Primeira Relação Um-para-Um Obrigatório Requerido

Ao usar o Entity Framework Code First 4.3.1, é possível criar relacionamentos com uma multiplicidade de 1 para 1. Ou seja, uma entidade em cada extremidade do relacionamento.

É possível configurar relacionamentos 1 para 1 para seremobrigatório exigido ouobrigatório-opcional ^. No entanto, quando alterno entre os dois, não vejo diferenças em:

O esquema do banco de dados gerado. Estou direcionando o SQL Server 2008.O comportamento em tempo de execução do EF.

Como tal, eu posso criar umRequiredPrincipalAs registro sem um correspondenteObrigatórioDependente Como registro, apesar de o relacionamento estar configurado comoobrigatório exigido. Isso parece contradizer a documentação paraTemRequirido (...):

Configura um relacionamento obrigatório deste tipo de entidade. As instâncias do tipo de entidade não poderão ser salvas no banco de dados, a menos que esse relacionamento seja especificado. A chave estrangeira no banco de dados será não anulável.

http://msdn.microsoft.com/pt-br/library/gg671317

oobrigatório exigido entidades de relacionamento:

public class RequiredPrincipalA
{
    public int Id { get; set; }
    public virtual RequiredDependentA DependentA { get; set; }
}

public class RequiredDependentA
{
    public int Id { get; set; }
    public virtual RequiredPrincipalA PrincipalA { get; set; }
}

oobrigatório-opcional entidades de relacionamento:

public class RequiredPrincipalB
{
    public int Id { get; set; }
    public virtual OptionalDependentB DependentB { get; set; }
}

public class OptionalDependentB
{
    public int Id { get; set; }
    public virtual RequiredPrincipalB PrincipalB { get; set; }
}

O DbContext e a configuração do modelo:

public class AppContext : DbContext
{
    public DbSet<RequiredPrincipalA> PrincipalAs { get; set; }
    public DbSet<RequiredDependentA> DependentAs { get; set; }

    public DbSet<RequiredPrincipalB> PrincipalBs { get; set; }
    public DbSet<OptionalDependentB> DependentBs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RequiredPrincipalA>()
            .HasRequired(o => o.DependentA)
            .WithRequiredPrincipal(o => o.PrincipalA);

        modelBuilder.Entity<RequiredPrincipalB>()
            .HasOptional(o => o.DependentB)
            .WithRequired(o => o.PrincipalB);
    }
}

O código de teste:

Database.SetInitializer(new DropCreateDatabaseAlways<AppContext>());

using (var ctx = new AppContext())
{
    ctx.Database.Initialize(force: false);

    ctx.PrincipalAs.Add(new RequiredPrincipalA());
    ctx.PrincipalBs.Add(new RequiredPrincipalB());

    ctx.SaveChanges();
}

Estou ciente de que poderia adicionar[Requeridos] atributo de dados para as propriedades de navegaçãoRequiredPrincipalA.DependentA eRequiredDependentA.PrincipalA. Isso faria com que a validação do EF impedisse o cenário acima. No entanto, não quero fazer isso porque também valida que a propriedade de navegação é preenchida ao atualizar uma entidade existente. Isso significa que o aplicativo deve buscar previamente a entidade na outra extremidade do relacionamento para cada atualização.

Por que eu não vejo nenhuma diferença no comportamento da EF apenas ao mudar uma relação entreobrigatório exigido eobrigatório-opcional?

^ Observe que o opcional opcional também é suportado, mas isso não faz parte da minha pergunta. Existem diferenças óbvias no esquema do banco de dados gerado e no comportamento do tempo de execução quando um relacionamento opcional-opcional é configurado.

questionAnswers(2)

yourAnswerToTheQuestion