c# - first - maxlength entity framework
Entity Framework 4.1 InverseProperty Attribute y ForeignKey (2)
Crearé dos referencias entre entidades de Empleados y Equipos con claves externas. Así que definí dos entidades como sigue
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
[ForeignKey("FirstTeam")]
public int FirstTeamId { get; set; }
[InverseProperty("FirstEmployees")]
public virtual Team FirstTeam { get; set; }
[ForeignKey("SecondTeam")]
public int SecondTeamId { get; set; }
[InverseProperty("SecondEmployees")]
public virtual Team SecondTeam { get; set; }
}
public class Team
{
public int Id { get; set; }
public string TeamName { get; set; }
[InverseProperty("FirstTeam")]
public virtual ICollection<Employee> FirstEmployees { get; set; }
[InverseProperty("SecondTeam")]
public virtual ICollection<Employee> SecondEmployees { get; set; }
}
Pensé que es correcto teóricamente, pero muestra la excepción de la siguiente manera:
{"Introducing FOREIGN KEY constraint ''Employee_SecondTeam'' on table ''Employees'' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints./r/nCould not create constraint. See previous errors."}
Alguien puede ayudarme?
Gracias de antemano Kwon
Es teóricamente correcto, pero al servidor SQL (no a Entity framework) no le gusta porque su modelo permite que un solo empleado sea miembro de los equipos First y Second. Si se elimina el Team
esto causará múltiples rutas de eliminación a la misma entidad Employee
.
Esto no se puede usar junto con las eliminaciones en cascada que se usan de forma predeterminada en el código EF primero si define una clave foránea como obligatoria (no anulable).
Si desea evitar la excepción, debe utilizar la asignación fluida:
public Context : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Team> Teams { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Employee>()
.HasRequired(e => e.SecondTeam)
.WithMany(t => t.SecondEmployees)
.HasForeignKey(e => e.FirstTeamId)
.WillCascadeOnDelete(false);
...
}
}
Esto dará lugar a un escenario en el que debe eliminar a los miembros de SecondTeam manualmente antes de eliminar el equipo.
Todo está correcto en la respuesta anterior, pero una cosa está mal
modelBuilder.Entity<Employee>()
.HasRequired(e => e.SecondTeam)
.WithMany(t => t.SecondEmployees)
.HasForeignKey(e => e.SecondTeamId) // mistake
.WillCascadeOnDelete(false);
FirstTeamId
lugar de SecondTeamId
hará que en la propiedad de SecondTeam navigation
FirstTeam
siempre sea FirstTeam