c# - example - entity framework database first
El final principal de esta asociación debe configurarse explícitamente mediante la relación fluida API o anotaciones de datos (1)
Las convenciones de Entity Framework Code-First suponen que EntityA.EntityB
y EntityB.PreferredEntityA
pertenecen a la misma relación y son propiedades de navegación inversas entre sí. Debido a que ambas propiedades de navegación son referencias (no colecciones), EF infiere una relación de uno a uno.
Como en realidad desea dos relaciones de uno a varios, debe anular las convenciones. Con tu modelo solo es posible con Fluent API:
modelBuilder.Entity<EntityA>()
.HasRequired(a => a.EntityB)
.WithMany()
.HasForeignKey(a => a.EntityBID);
modelBuilder.Entity<EntityB>()
.HasOptional(b => b.PreferredEntityA)
.WithMany()
.HasForeignKey(b => b.PreferredEntityAID);
(Si usa esto, puede eliminar los atributos [ForeignKey]
.)
No puede especificar una asignación que garantice que el hijo preferido sea siempre uno de los hijos asociados.
Si no desea utilizar la API EntityB
pero solo las anotaciones de datos, puede agregar una propiedad de colección en EntityB
y relacionarla con EntityA.EntityB
usando el atributo [InverseProperty]
:
public class EntityB
{
public int ID { get; set; }
public Nullable<int> PreferredEntityAID { get; set; }
[ForeignKey("PreferredEntityAID")]
public virtual EntityA PreferredEntityA { get; set; }
[InverseProperty("EntityB")] // <- Navigation property name in EntityA
public virtual ICollection<EntityA> EntityAs { get; set; }
}
"El final principal de esta asociación debe configurarse explícitamente mediante la relación fluida API o anotaciones de datos".
Recibo este error en Entity Framework 4.4 al actualizar / migrar la base de datos, pero no estoy tratando de especificar una relación 1: 1. Quiero algo como esto:
public class EntityA
{
public int ID { get; set; }
public int EntityBID { get; set; }
[ForeignKey("EntityBID")]
public virtual EntityB EntityB { get; set; }
}
public class EntityB
{
public int ID { get; set; }
public Nullable<int> PreferredEntityAID { get; set; }
[ForeignKey("PreferredEntityAID")]
public virtual EntityA PreferredEntityA { get; set; }
}
donde EntityA debe tener un padre EntityB, mientras que EntityB puede tener un hijo EntityA preferido, pero no tiene que hacerlo. El hijo preferido debe ser uno de los hijos asociados con el padre, pero no sé cómo aplicar esto en la base de datos. Estoy planeando hacerla cumplir programáticamente.
¿Cómo puedo evitar este error o cuál es la mejor manera de lograr estas relaciones?