我有一个用户实体,我的用户存储在其中。对于某些用户(管理员),我想添加其他详细信息。 我写了以下代码。
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类中创建“后退”导航?
答案 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; }
}