Entity Framework: jak rozwiązać problem „FOREIGN KEY constraint może powodować cykle lub wiele ścieżek kaskadowych”?
jest wiele pytań dotyczących tego problemu, ale nie mogłem rozwiązać mojego przypadku. czy ktoś może spojrzeć na to:
mamOffice
stół, z którym ma jeden związekDoctor
iSecretary
stoły. Obie ostatnie tabele pochodzą zEmployee
tabela, która ma relację współdzielonego klucza podstawowego z predefiniowanymUsers
tabela utworzona przezsqlmembershipprovider
. Wydaje się, że istnieje wiele relacji międzyUsers
stół iRoles
stół, w który nie mam żadnej ręki.
Mój problem polegał na stworzeniu (zero, jeden) - (jednego) związku między moimEmployee
stół i toUsers
tabelę, którą zakończyłem współużytkowaną relacją klucza podstawowego między nimi a podniesionym błędem (Czy istnieje lepsze rozwiązanie tego problemu?)
tutaj jest błąd:
Wprowadzenie ograniczenia KLUCZA ZAGRANICZNEGO „FK_dbo.aspnet_UsersInRoles_dbo.aspnet_Users_UserId” w tabeli „aspnet_UsersInRoles” może powodować cykle lub wiele ścieżek kaskadowych. Określ ON DELETE NO ACTION lub ON UPDATE NO ACTION lub zmodyfikuj inne ograniczenia FOREIGN KEY. Nie można utworzyć ograniczenia. Zobacz poprzednie błędy.
oto moje kody i kody członkostwa po inżynierii odwrotnej:
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; }
}
EDYTOWAĆ: a relacje pogłębiają się, istnieje między nimi jeden związekUsers
stół iApplications
stół, także międzyRoles
iApplications
zbyt.