【问题标题】:Entity Framework doesn't generate navigation property despite having valid foreign key尽管具有有效的外键,实体框架不会生成导航属性
【发布时间】:2015-11-08 18:48:49
【问题描述】:

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

我正在使用 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();

【问题讨论】:

  • 调用 SaveChanges() 会出现什么错误
  • “一个或多个实体的验证失败。有关详细信息,请参阅 'EntityValidationErrors' 属性。”当我探索“EntityValidationErrors”以获取更多详细信息时,它只会重申它是一个验证错误。我认为验证错误是因为 EF 正在尝试添加一个 GroupMembership 对象,该对象的“用户”引用为空值,但此“用户”字段被注释为必需,因此验证失败。
  • 转到异常的 EntityValidationErrors 属性并向我们展示内容:)
  • 这很奇怪。因为所有两个属性都标记为虚拟,并且如果您在上下文中启用了“延迟加载”,则必须按需加载所有导航属性,但用户属性似乎并非如此。因为您的导航属性具有关联的外键属性,所以只需将Required 数据注释放在它们上面。
  • 非常怀疑它是否会起作用,但值得一试。您是否尝试将所需的注释移动到字段而不是导航属性?

标签: c# asp.net-mvc entity-framework ef-code-first asp.net-identity


【解决方案1】:

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

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 会起作用,除非它在你编辑之前就保存了。

请注意,由于您没有在代码中设置 nav 属性,您只是设置了外键值,因此您遇到了错误,这也是您需要移动注释的原因。

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

【讨论】:

  • 你应该给@CodeNotFound 的答案,+1 就够了。无论如何都很乐意提供帮助..
【解决方案2】:

尝试调用 SaveChanges() 时出现错误,经过仔细检查,我发现 ApplicationUser 导航属性为空,尽管用户 ID 有效。同时,使用 GroupID 成功生成了 Group 导航属性。

这很奇怪。因为所有两个属性都标记为虚拟,如果您在上下文中启用了“延迟加载”,则必须按需加载所有导航属性,但用户属性似乎并非如此。

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

  • GroupIDGroup
  • UserIDUser

然后只需将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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多