我首先使用实体框架代码。我有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)
怎么了?
答案 0 :(得分:5)
因为User
中有{em>两个导航属性Users
和Profile
引用User
实体,EF无法通过约定来决定这两者属于实体Profile
中的反向属性User
。您必须使用[InverseProperty]
属性提示提示:
[InverseProperty("Users")]
public virtual Profile Profile { get; set; }
现在,它定义User.Profile
是Profile.Users
的反向导航属性,并且两者都是相同关系的结尾。如果没有属性,EF假定两个导航属性是两个不同关系的结尾,其中一个负责额外的外键Profile_Id
。
Here有点背景。