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