保存具有所有必需属性的对象时出现实体框架验证错误

本文关键字:实体 验证 错误 框架 保存 属性 对象 | 更新日期: 2023-09-27 18:32:04

我有以下模型:

[Table("EventUserDetails")]
public class EventUserDetail
{
    [Key]
    public int Id { get; set; }
    public bool Invited { get; set; }
    public DateTime? InviteDate { get; set; }
    [Required]
    public virtual User User { get; set; }
    [Required]
    public virtual Event Event { get; set; }
}

事件和用户也是模型,我将它们设置为 [必需],因为我希望数据库字段不可为空(代码优先)。

如果我从数据库中获取一个对象并尝试保存它:

EventUserDetail de = db.EventUserDetails.Where(m => m.Id == id).Single();
de.Invited = true;
db.SaveChanges();

我收到错误:

- Property: "User", Error: "The User field is required."
- Property: "Event", Error: "The Event field is required."

User 和 Event 属性表示其他链接对象,在调试期间,就在保存之前,我可以看到它们已填充。

为什么我会收到这些错误? 是否不建议对代表其他模型的虚拟属性具有 [必需]?

保存具有所有必需属性的对象时出现实体框架验证错误

您可以在模型中包括外键,并指定外键本身是必需的,如下所示:

public class EventUserDetail
{
    [Key]
    public int Id { get; set; }
    public bool Invited { get; set; }
    public DateTime? InviteDate { get; set; }
    [Required]
    [ForeignKey("User")]
    public int UserId { get; set; }
    public virtual User User { get; set; }
    [Required]
    [ForeignKey("Event")]
    public int EventId { get; set; }
    public virtual Event Event { get; set; }
}

这将允许您在不加载相关实体的情况下更新模型。EF 将通过确保已设置外键UserIdEventId来强制满足所需的要求。

请注意,您可能希望更改模型中这些属性的名称以匹配数据库中的属性,以便模型与数据库中的表结构匹配。