【发布时间】:2015-11-08 18:48:49
【问题描述】:
我见过类似的问题,但我看不出它们与我的问题之间的联系,我认为我的问题比那些简单得多。
我正在使用 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();
【问题讨论】:
-
调用 SaveChanges() 会出现什么错误
-
“一个或多个实体的验证失败。有关详细信息,请参阅 'EntityValidationErrors' 属性。”当我探索“EntityValidationErrors”以获取更多详细信息时,它只会重申它是一个验证错误。我认为验证错误是因为 EF 正在尝试添加一个 GroupMembership 对象,该对象的“用户”引用为空值,但此“用户”字段被注释为必需,因此验证失败。
-
转到异常的 EntityValidationErrors 属性并向我们展示内容:)
-
这很奇怪。因为所有两个属性都标记为虚拟,并且如果您在上下文中启用了“延迟加载”,则必须按需加载所有导航属性,但用户属性似乎并非如此。因为您的导航属性具有关联的外键属性,所以只需将
Required数据注释放在它们上面。 -
非常怀疑它是否会起作用,但值得一试。您是否尝试将所需的注释移动到字段而不是导航属性?
标签: c# asp.net-mvc entity-framework ef-code-first asp.net-identity