2011-04-29 2 views
31

외래 키가있는 Employee 및 Team 엔터티간에 두 개의 참조를 만듭니다. 나는 그것이 이론적으로 올바른 생각Entity Framework 4.1 InverseProperty 특성 및 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."} 

아무도 나를 도울 수 있습니까? 사전 권

에서

덕분에

답변

54

그것은 이론적으로 정확하지만 모델 제 1 및 제 2 팀 모두의 구성원이어야 하나 직원 수 있기 때문에 SQL 서버 (안 엔티티 프레임 워크)를 좋아하지 않는다. 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의 구성원을 삭제해야합니다 경우.

+0

될 것입니다 원인이됩니다

modelBuilder.Entity<Employee>() .HasRequired(e => e.SecondTeam) .WithMany(t => t.SecondEmployees) .HasForeignKey(e => e.SecondTeamId) // mistake .WillCascadeOnDelete(false); 

FirstTeamId 대신 SecondTeamId의 잘못하지만 당신은 EF가 키를 생성 할 경우는 것입니다 그 (것)들을 null 허용 가능하게하십시오 (선택적인 관계). 유창한 매핑을 사용할 때 컬럼 이름을 외래 키로 사용합니다. –

+0

라디 슬라브에 감사드립니다. 그게 바로 제가 찾고 있던 것입니다. – Ray

+0

내 의견을 삭제 해 주셔서 죄송합니다. 그러나 그렇다면 외부 키 속성을 public int와 같이 nullable로 정의하면 가능합니까? FirstTeamId {get; 설정;}? – Ray

2

모든 이전의 대답에 정확하지만 한 가지 SecondTeam navigation 속성이 항상 FirstTeam

관련 문제