Acabo de empezar a usar el código EF primero, así que soy un principiante en este tema.
Quería crear relaciones entre equipos y partidos:
1 partido = 2 equipos (local, invitado) y resultado.
Pensé que era fácil crear un modelo así, así que comencé a codificar:
public class Team
{
[Key]
public int TeamId { get; set;}
public string Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
public class Match
{
[Key]
public int MatchId { get; set; }
[ForeignKey("HomeTeam"), Column(Order = 0)]
public int HomeTeamId { get; set; }
[ForeignKey("GuestTeam"), Column(Order = 1)]
public int GuestTeamId { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public DateTime Date { get; set; }
public virtual Team HomeTeam { get; set; }
public virtual Team GuestTeam { get; set; }
}
Y me sale una excepción:
La relación referencial dará como resultado una referencia cíclica que no está permitida. [Nombre de restricción = Match_GuestTeam]
¿Cómo puedo crear un modelo así, con 2 claves foráneas para la misma tabla?
También es posible especificar el
ForeignKey()
atributo en la propiedad de navegación:De esa manera, no necesita agregar ningún código al
OnModelCreate
métodofuente
OnModelCreate
según la respuesta aceptada, así como las dos colecciones para ambos lados de la relación.Sé que es una publicación de varios años y puede resolver su problema con la solución anterior. Sin embargo, solo quiero sugerir el uso de InverseProperty para alguien que todavía lo necesita. Al menos no necesitas cambiar nada en OnModelCreating.
El siguiente código no se ha probado.
Puede leer más sobre InverseProperty en MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
fuente
Puedes probar esto también:
Cuando hace que una columna FK permita NULLS, está rompiendo el ciclo. O simplemente estamos engañando al generador de esquemas EF.
En mi caso, esta simple modificación resuelve el problema.
fuente
Esto se debe a que las eliminaciones en cascada están habilitadas de forma predeterminada. El problema es que cuando llama a una eliminación en la entidad, eliminará también cada una de las entidades referenciadas con la tecla f. No debe hacer que los valores 'obligatorios' puedan anularse para solucionar este problema. Una mejor opción sería eliminar la convención de eliminación en cascada de EF Code First:
Probablemente sea más seguro indicar explícitamente cuándo hacer una eliminación en cascada para cada uno de los elementos secundarios al mapear / configurar. la entidad.
fuente
Restrict
en lugar deCascade
?InverseProperty
EF Core hace que la solución sea fácil y limpia.Propiedad inversa
Entonces la solución deseada sería:
fuente