Entity Framework 4.1 InverseProperty Attribute и ForeignKey
Я создам две ссылки между сущностями Сотрудника и Команды с внешними ключами. Итак, я определил две сущности следующим образом
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; }
}
Я думал, что это правильно теоретически, но это показывает исключение следующим образом:
{"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."}
Кто-нибудь может мне помочь?
Заранее спасибо Квон
2 ответа
Это теоретически правильно, но SQL-серверу (не Entity Framework) это не нравится, потому что ваша модель позволяет одному сотруднику быть членом первой и второй групп. Если Team
удаляется, это приведет к нескольким путям удаления к одному Employee
юридическое лицо.
Это нельзя использовать вместе с каскадным удалением, которое используется по умолчанию в коде EF, если вы определили внешний ключ как обязательный (не обнуляемый).
Если вы хотите избежать исключения, вы должны использовать свободное отображение:
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);
...
}
}
Это приведет к сценарию, в котором вы должны удалить участников SecondTeam вручную перед удалением команды.
Все верно в предыдущем ответе, но одна вещь не так
modelBuilder.Entity<Employee>()
.HasRequired(e => e.SecondTeam)
.WithMany(t => t.SecondEmployees)
.HasForeignKey(e => e.SecondTeamId) // mistake
.WillCascadeOnDelete(false);
FirstTeamId
вместо SecondTeamId
приведет к тому, что в SecondTeam navigation
собственность будет всегда FirstTeam