由于Entity中的“必需”导航属性,所以ModelState.IsValid为false

时间:2018-12-29 18:09:36

标签: c# asp.net-mvc entity-framework required modelstate

LessonQuestionDetails 中的导航属性中的Required批注实体模型,它可以通过代码优先方法实现级联删除表的创建< / strong>,导致ModelState.IsValid变成false。是否有一种解决方法可以设置不带Required批注的层叠删除。

实体模型

public partial class LessonQuestionDetail
{
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int LessonID { get; set; }

    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int QuestionNumber { get; set; }

    [Key, Column(Order = 2), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public byte ChoiceNumber { get; set; }
    public string Choice { get; set; }
    public bool IsCorrect { get; set; }

    [Required]  // Sets the CASCADE constraint, while creating table
    public virtual LessonQuestion LessonQuestion { get; set; }
}

public partial class LessonQuestion
{
    public LessonQuestion()
    {
        this.LessonQuestionDetails = new List<LessonQuestionDetail>();
    }

    public virtual ICollection<LessonQuestionDetail> LessonQuestionDetails { get; set; }
    //Other code
}

控制器

[HttpPost]
public ActionResult EditLessonQuestionDetails(LessonQuestion lq)
{
    SQLContext context = new SQLContext();
    int intChoiceNum=1;
    var errors = ModelState.Values.SelectMany(v => v.Errors); // There are errors
    var valid = ModelState.IsValid;  // sets False
    // Other code
}

1 个答案:

答案 0 :(得分:3)

您可以使用流畅的API。

如下所示的方法应该可以工作,但是可能需要像在编辑器上编写的那样进行调整,并且没有对其进行测试,但这就是要点

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     modelBuilder.Entity<LessonQuestion>()
        .HasOptional(c => c.LessonQuestion)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
 }

但是,直接将Entity Framework模型与API一起使用是一个不好的设计。

您应该将视图模型用于API所需的属性,然后将其映射到Entity Framework模型。切勿直接暴露Entity Framework模型,因为它只会导致问题,并且更改Entity Framework模型将需要在应用程序范围内进行更改,包括使用API​​的应用程序,这将成为维护噩梦的一个途径。