首先使用一对多关系的EF 4.1代码会创建重复的外键

时间:2013-05-20 21:24:15

标签: entity-framework code-first

我首先使用实体​​框架代码。我有2个实体(用户和配置文件),它们之间的关系是一对多,即一个用户只能有一个配置文件,但一个配置文件可以分配给许多用户。实体下方:

[Table("Users")]
public class User
{
    [Key(), Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public virtual string Name { get; set; }

    [Required]
    [ForeignKey("Profile")]
    public virtual int ProfileId { get; set; }
    public virtual Profile Profile { get; set; }

    public virtual ICollection<AnotherEntityB> anotherEntityB { get; set; } 
}

[Table("Profiles")]
public class Profile
{
    [Key(), Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public virtual string Name { get; set; }

    // Below the user that performs the discharge of the profile. Only 1 user can do it.
    [ForeignKey("User")]
    public virtual int? UserId { get; set; }
    public virtual User User { get; set; }

    public virtual DateTime? dischargeDate { get; set; } <-- this is the date that user performs the discharge of the profile

    public virtual ICollection<User> Users { get; set; }


    public virtual ICollection<AnotherEntityC> anotherEntityC { get; set; }
}

我也删除了OnModelCreating方法中的一些约定:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

问题是EF在用户实体中创建了两个外键:

ProfileId (FK, int, No NULL)
Profile_Id (FK, int, NULL)

并且只有一个外键应该在Users实体中:     ProfileId(FK,int,No NULL)

怎么了?

1 个答案:

答案 0 :(得分:5)

因为User中有{em>两个导航属性UsersProfile引用User实体,EF无法通过约定来决定这两者属于实体Profile中的反向属性User。您必须使用[InverseProperty]属性提示提示:

[InverseProperty("Users")]
public virtual Profile Profile { get; set; }

现在,它定义User.ProfileProfile.Users的反向导航属性,并且两者都是相同关系的结尾。如果没有属性,EF假定两个导航属性是两个不同关系的结尾,其中一个负责额外的外键Profile_Id

Here有点背景。