Entity Framework: cómo resolver “¿La restricción FOREIGN KEY puede causar ciclos o múltiples rutas en cascada”?
Hay muchas preguntas sobre este problema, pero no pude resolver mi caso. alguien puede por favor echar un vistazo a esto:
Yo tengo unOffice
mesa que tiene una relación de muchos conDoctor
ySecretary
mesas. Las dos últimas tablas, se derivan deEmployee
tabla que tiene una relación de clave primaria compartida con predefinidoUsers
mesa creada porsqlmembershipprovider
. Parece que hay una relación de muchos a muchosUsers
mesa yRoles
Mesa en la que no tengo ninguna mano.
Mi problema estaba en crear una relación (cero, uno) - (uno) entre misEmployee
mesa y esoUsers
tabla que terminé con una relación de clave primaria compartida entre ellos y el error planteado, entonces. (¿Hay una mejor solución para ese problema?)
Aquí está el error:
La introducción de la restricción FOREIGN KEY 'FK_dbo.aspnet_UsersInRoles_dbo.aspnet_Users_UserId' en la tabla 'aspnet_UsersInRoles' puede causar ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o ON UPDATE NO ACTION, o modifique otras restricciones FOREIGN KEY. No se pudo crear la restricción. Ver errores anteriores.
Aquí están mis códigos y códigos de membresía después de ingeniería inversa:
public class Office
{
public Office()
{
this.Doctors = new HashSet<Doctor>();
this.Secretaries = new HashSet<Secretary>();
}
[Key]
public System.Guid OfficeId { get; set; }
public virtual ICollection<Doctor> Doctors { get; set; }
public virtual ICollection<Secretary> Secretaries { get; set; }
}
public class Employee
{
[Key, ForeignKey("User")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public System.Guid Id { get; set; }
public string Name { get; set; }
[ForeignKey("Office")]
public System.Guid OfficeId { get; set; }
// shared primary key
public virtual aspnet_Users User { get; set; }
public virtual Office Office { get; set; }
}
public class Doctor :Employee
{
public Doctor()
{
this.Expertises = new HashSet<Expertise>();
}
//the rest..
public virtual ICollection<Expertise> Expertises { get; set; }
}
public class Secretary : Employee
{
// blah blah
}
public class aspnet_Users
{
public aspnet_Users()
{
this.aspnet_Roles = new List<aspnet_Roles>();
}
public System.Guid ApplicationId { get; set; }
public System.Guid UserId { get; set; }
//the rest..
public virtual aspnet_Applications aspnet_Applications { get; set; }
public virtual ICollection<aspnet_Roles> aspnet_Roles { get; set; }
}
public class aspnet_Roles
{
public aspnet_Roles()
{
this.aspnet_Users = new List<aspnet_Users>();
}
public System.Guid ApplicationId { get; set; }
public System.Guid RoleId { get; set; }
//the rest..
public virtual aspnet_Applications aspnet_Applications { get; set; }
public virtual ICollection<aspnet_Users> aspnet_Users { get; set; }
}
EDITAR: y las relaciones se profundizan, hay una relación de muchos entreUsers
mesa yApplications
mesa, también entreRoles
yApplications
también.