Al usar el Código de Entidad Framework Primero 4.3.1 es posible crear relaciones con una multiplicidad de 1-a-1. Es decir, una entidad en cada extremo de la relación.Código de Entity Framework Primera relación uno-a-uno requerida-requerida
Es posible configurar 1-a-1 relaciones de ser -requerido requerido o requerido opcional ^. Sin embargo, cuando cambio entre los dos, no veo ninguna diferencia en:
- El esquema de la base de datos generado. Me estoy dirigiendo a SQL Server 2008.
- El comportamiento en tiempo de ejecución de EF.
Como tal, yo soy capaz de crear un RequiredPrincipalAs registro sin la correspondiente RequiredDependentAs registro, a pesar de la relación que se está configurando como -necesaria requerida. Esto parece contradecir la documentación para HasRequired (...):
Configura una relación necesaria de este tipo de entidad. Las instancias del tipo de entidad no podrán guardarse en la base de datos a menos que se especifique esta relación. La clave externa en la base de datos no podrá contener nulos.
Los requerida requeridas- entidades relación:
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; }
}
Los entidades relación requeridos-opcionales:
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; }
}
El DbContext y modelo conf iguration:
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);
}
}
El código de prueba:
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();
}
Soy consciente de que podría añadir un atributo de datos[Obligatorio] a las propiedades de navegación de RequiredPrincipalA.DependentA y RequiredDependentA.PrincipalA . Esto provocaría que la validación EF evite el escenario anterior. Sin embargo, no quiero hacer esto porque también valida que la propiedad de navegación se rellene al actualizar una entidad existente. Esto significa que la aplicación debe prearchivar la entidad en el otro extremo de la relación para cada actualización.
¿Por qué no veo ninguna diferencia en el comportamiento de EF simplemente al cambiar una relación entre -necesaria requerida y requiere opcional?
^Tenga en cuenta que opcional-opcional también es compatible, pero esto no forma parte de mi pregunta. Existen diferencias obvias en el esquema de base de datos generado y el comportamiento en tiempo de ejecución cuando se configura una relación opcional-opcional.
Gracias por su respuesta. Sin duda, aclara el aspecto del esquema de la base de datos de mi pregunta. Sin embargo, estoy muy interesado en entender por qué no hay ningún cambio de comportamiento aparente en EF. –
¿Podría ser que required-required está permitido porque EF puede aplicarlo en tiempo de ejecución aunque no sea posible hacer cumplir esta restricción en SQL? –
Luke, el hecho de que no haya diferencia en el esquema al configurar r/r yr/o ahora se comprende gracias a la respuesta de Ladislav. El punto ahora es que r/r no parece ser aplicado en tiempo de ejecución por EF, a pesar de lo que dice la documentación. –