Entity Framework 不生成导航 属性 尽管有有效的外键

Entity Framework doesn't generate navigation property despite having valid foreign key

我见过类似的问题,但我没有看到它们与我的问题之间的联系,我认为我的问题比那些简单得多。

我将 EF 与代码优先方法结合使用,在我开始向我的模型(RequiredForeignKey)添加显式数据注释之前,该方法运行良好

这可能是一个 EF 身份问题,或者只是一个 EF 代码优先问题

我的模型:

public class GroupMembership
{
    public int ID { get; set; }
    public int GroupID { get; set; }
    public string UserID { get; set; }

    [Required, ForeignKey("GroupID")]
    public virtual Group Group { get; set; }
    [Required, ForeignKey("UserID")]
    public virtual ApplicationUser User { get; set; }
}

现在的问题是当我尝试添加一个实例时:

GroupMembership grpMem = new GroupMembership()
{
    GroupID = grpID,
    UserID = userID,
};
context.GroupMemberships.Add(grpMem);
context.SaveChanges();

我在尝试调用 SaveChanges() 时遇到错误,仔细检查后我发现 ApplicationUser 导航 属性 是空的,尽管有一个有效的 UserID。同时,使用 GroupID.

成功生成了 Group 导航 属性

UserID 是与当前 ApplicationUser 关联的字符串 ID,我使用

检索它
string userId = User.Identity.GetUserId();

I get an error when trying to call SaveChanges(), and upon closer inspection I see that the ApplicationUser navigation property is null despite having a valid UserID. Meanwhile, the Group navigation property was successfully generated using GroupID.

这很奇怪。因为所有这两个属性都被标记为虚拟,如果您在上下文中启用了 'Lazy Loading',那么所有导航属性都必须按需加载,但用户 属性.

似乎并非如此

因为您的导航属性具有关联的外键属性:

  • GroupID 对于 Group
  • UserID 对于 User

然后像下面的代码一样在它们上面添加 Required 数据注释:

public class GroupMembership
{
    public int ID { get; set; }
    [Required]
    public int GroupID { get; set; }
    [Required]
    public string UserID { get; set; }

    [ForeignKey("GroupID")]
    public virtual Group Group { get; set; }
    [ForeignKey("UserID")]
    public virtual ApplicationUser User { get; set; }
}

尝试将所需的注释移动到字段而不是导航属性,如下所示:

public class GroupMembership
{
    public int ID { get; set; }
    [Required]
    public int GroupID { get; set; }
    [Required]
    public string UserID { get; set; }  
    [ForeignKey("GroupID")]
    public virtual Group Group { get; set; }
    [ForeignKey("UserID")]
    public virtual ApplicationUser User { get; set; }
}

老实说,我不知道为什么 groupID 会起作用,除非它在你编辑之前就被保存了。

请注意,您收到错误是因为您没有在代码中设置导航 属性,您只是设置了外键值,这也是您需要移动注释的原因。

作为替代方案,我认为您可以保留 Required 注释,以防您在 savechanges() 之前在代码中设置它。