Entity Framework 4.1 InverseProperty Attribute and ForeignKey

独自空忆成欢 提交于 2019-11-26 09:33:03

问题


I will create two references between Employee and Team entities with foreign keys. So I defined two entities as follow

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; }
}

I thought it is correct theoretically, but it shows the Exception as follow :

{\"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.\"}

Can anybody help me?

Thanks in advance Kwon


回答1:


It is theoretically correct but SQL server (not Entity framework) doesn't like it because your model allows single employee to be a member of both First and Second team. If the Team is deleted this will cause multiple delete paths to the same Employee entity.

This cannot be used together with cascade deletes which are used by default in EF code first if you define foreign key as mandatory (not nullable).

If you want to avoid the exception you must use fluent mapping:

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);

        ...
    }
}

This will result in scenario where you must delete members of SecondTeam manually before you delete the team.




回答2:


All is correct in previous answer, but one thing is wrong

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

FirstTeamId instead of SecondTeamId will cause that in SecondTeam navigation property will be always FirstTeam



来源:https://stackoverflow.com/questions/5828394/entity-framework-4-1-inverseproperty-attribute-and-foreignkey

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!