0

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

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

}

我喜欢通过编写例如从我的 AdminDetail 表导航回我的用户配置文件表。admin.UserProfile.UserName。但是,当我运行 Database-Update 时,我收到:

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

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

4

2 回答 2

2

Entity Framework Code-First 允许将多态类存储在同一个表中。您是否考虑过使用这样的关系?

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 类型的实体。

于 2013-03-14T14:21:14.053 回答
0

你不需要在你的UserProfile班级有一个 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; }
} 
于 2013-03-14T14:11:08.187 回答