Entity framework EF 5.0代码优先导航属性

Entity framework EF 5.0代码优先导航属性,entity-framework,code-first,Entity Framework,Code First,我有一个用户实体,其中存储了我的用户。对于一些用户(管理员),我想添加其他详细信息。 我已经编写了以下代码 public partial class UserProfile { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } [Display(Name = "EMail")] [Required] publi

我有一个用户实体,其中存储了我的用户。对于一些用户(管理员),我想添加其他详细信息。 我已经编写了以下代码

 public partial class UserProfile 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "EMail")]
    [Required]
    public string UserName { get; set; }



    [ForeignKey("AdminDetailID")]
    public virtual AdminDetail AdminDetail { get; set; }
    public int? AdminDetailID { get; set; }

}   

public class AdminDetail 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AdminDetailID { get; set; }

    [ForeignKey("UserId")]
    public virtual UserProfile UserProfile { get; set; }
    public int UserId { get; set; }   

}
我喜欢通过编写例如admin.UserProfile.UserName从AdminDetail表导航回用户配置文件表。但是,当我运行数据库更新时,我会收到:

必须使用关系fluent API或数据注释显式配置此关联的主体端


当我删除UserProfile属性时,一切都很好。。如何在AdminDetail类中创建“后退”导航?

您不需要在
用户配置文件中设置FK。要设置正确的1:1,实际上只有
AdminDetail
类需要有
UserProfile
类的外键。您仍然可以保留虚拟财产,以便能够来回导航,EF将知道您在做什么。与此类似:

public partial class UserProfile 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "EMail")]
    [Required]
    public string UserName { get; set; }

    public virtual AdminDetail AdminDetail { get; set; }
} 

实体框架代码首先允许多态类存储在同一个表中。你考虑过用这样的关系来代替吗

public partial class UserProfile 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Display(Name = "EMail")]
    [Required]
    public string UserName { get; set; }
}   

public class AdminProfile : UserProfile   
{
    // AdminProfile members.
}
这将生成一个UserProfile表,其中包含一个名为Discriminator的附加列,EF将为您创建和管理该列。此列指示表中的每一行是UserProfile还是AdminProfile。当EF访问时,UserProfile类型的行忽略特定于AdminProfile的列

实体框架为您处理所有类型区分,所以您不必直接担心这一点。您的DbContext将只具有一个DbSet,它还可以存储AdminProfile类型的实体