【问题标题】:EntityState.Modified does work differently on updating in EF Core vs EF 6EntityState.Modified 在 EF Core 与 EF 6 中的更新工作方式不同
【发布时间】:2016-11-01 19:43:34
【问题描述】:

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

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

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

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

更新

我在 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.

当我将整个实体状态设置为已修改时,当它的一个属性(例如 Student.SchoolclassId)是外键时,是否会出现问题?

更新 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; }
}

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

【问题讨论】:

  • 在 EF Core 中的工作方式与在 EF 6 中相同。使用分析器查看正在执行的 SQL。
  • 有趣... savechanges 永远不会出现在我的 sql profiler 中!!!
  • 当然其他的东西会显示在我的 sql profiler 中,这不是问题...
  • 很抱歉,您无法通过赏金解决含糊的问题。您不会显示student 在进入方法时的样子,或者类及其关联的样子。非常重要的信息。
  • 好吧,如果您将实体标记为已修改,您只需将所有字段标记为已修改,包括 FK 值(它们只是原始属性)。因此,如果 FK 值不存在...繁荣。另一种方法是将特定属性标记为已修改。

标签: c# entity-framework-6 entity-framework-core


【解决方案1】:

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

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

换句话说,这个错误不是因为 EF 6 vs EF 7,而是因为在相关表中找不到外键。

【讨论】:

  • 终于有人复制/粘贴我的评论了! ;-)
猜你喜欢
  • 2011-12-02
  • 2019-11-19
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2019-02-06
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多