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.