在EF Core与EF 6中进行更新时,EntityState.Modified的工作方式不同

Pas*_*cal 9 c# entity-framework-6 entity-framework-core

当我使用EF 6运行此方法时,学生已更新!

 public async Task Update(Student student)
        {
            context.Entry(student).State = EntityState.Modified;
            await context.SaveChangesAsync();
        }
Run Code Online (Sandbox Code Playgroud)

当我用EF 7运行这个方法时,数据库中没有任何变化!

我错了什么?我不想先检索实体来更新它!

UPDATE

我在SaveChanges周围放了一个try/catch并得到了这个错误信息:

The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_Students_Schoolclasses_SchoolclassId". The conflict occurred in database "TGBData", table "dbo.Schoolclasses", column 'Id'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

当我将其中一个属性(例如Student.SchoolclassId)设置为外键时,将WHOLE实体状态设置为已修改时,是否存在问题?

更新2

public class Student
{
    public Student()
    {
        StudentsTests = new HashSet<StudentTest>();
        StudentsSubjects = new HashSet<SubjectStudent>();
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ISet<StudentTest> StudentsTests { get; set; }
    public ISet<SubjectStudent> StudentsSubjects { get; set; }
    public Schoolclass Schoolclass { get; set; }
    public int SchoolclassId { get; set; }
}

public class Schoolclass
{
    public Schoolclass()
    {
        Students = new HashSet<Student>();
        Tests = new HashSet<Test>();
    }

    public int Id { get; set; }
    public string Number { get; set; }
    public ISet<Student> Students { get; set; }
    public ISet<Test> Tests { get; set; }

    public Schoolyear Schoolyear { get; set; }
    public int SchoolyearId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

输入Update方法时,学生FirstName/LastName属性具有新值!

Cod*_*shi 0

您的错误表明您的学生有 SchoolclassId,并且该值不存在于外部表中,该外部表是 Schoolclasses 表中的 Id。

在调用 SaveChanges 之前检查 SchoolclassId 的值。Schoolclasses 表中很可能不存在该值。

换句话说,此错误不是由于 EF 6 与 EF 7 引起的,而是由于在相关表中找不到外键引起的。