Entity Framework 不生成导航 属性 尽管有有效的外键
Entity Framework doesn't generate navigation property despite having valid foreign key
我见过类似的问题,但我没有看到它们与我的问题之间的联系,我认为我的问题比那些简单得多。
我将 EF 与代码优先方法结合使用,在我开始向我的模型(Required
和 ForeignKey
)添加显式数据注释之前,该方法运行良好
这可能是一个 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() 之前在代码中设置它。
我见过类似的问题,但我没有看到它们与我的问题之间的联系,我认为我的问题比那些简单得多。
我将 EF 与代码优先方法结合使用,在我开始向我的模型(Required
和 ForeignKey
)添加显式数据注释之前,该方法运行良好
这可能是一个 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() 之前在代码中设置它。