EF 5.0代码第一个导航属性

时间:2013-03-14 14:00:52

标签: 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; }



    [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类中创建“后退”导航?

2 个答案:

答案 0 :(得分:2)

实体框架代码优先允许将多态类存储在同一个表中。您是否考虑过使用这样的关系?

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。 UserProfile类型的行在被EF访问时会忽略AdminProfile特定的列。

实体框架会为您处理所有类型歧视,因此您无需直接担心。您的DbContext将只有一个DbSet,它也可以存储AdminProfile类型的实体。

答案 1 :(得分: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; }
}