如何在更新前检查属性是否实际发生变化

时间:2016-10-18 08:22:17

标签: c# entity-framework entity-framework-5

我使用的是EF 5(不是6)。我有一个类以下的对象,它在使用EF的数据库中。

public class Student
{
  public string Name { get; set; }
  public int Age { get; set; }
  public DateTime DOB { get; set;}
}

稍后,

我收到了对同一对象/记录进行更新的请求。

但是在进行更新调用之前,我想交叉比较属性是否实际发生了变化,因为我可能会获得相同的更新记录,因此不想进行盲目更新。

 var student = _context.Students.select(x =>x.Name == "").first();
 student.name = "";
 student.age = "";
 student.DOB = "";
_context.Entry(student).State = EntityState.Modified;
_context.saveChanges();

EF是否为我提供了一些内置的方法?

或者,我需要逐个比较每个属性并决定?我可以拥有20个房产...

请问好吗?

3 个答案:

答案 0 :(得分:1)

以下声明:

_context.Entry(student).State = EntityState.Modified;
_context.saveChanges();

将更新实体的所有相关字段,从而标记为脏。

背后的代码是这样的:

UPDATE student
SET Value 1 = 'whatever student name is',
    Value 2 = 'whatever student name is'
WHERE Id = 123; 

如果您想更新特定值,请使用

_context.Student.Attach(student)

背后的代码将如下所示:

    UPDATE student
    SET Value 1 = 'whatever student name is'
WHERE Id = 123;

如果要在更新之前检查属性是否更改,请覆盖对象的equals方法并比较所需的属性:

public override bool Equals(object obj)
{
    return MyProperty == ((MyObject)obj).MyProperty
}

答案 1 :(得分:1)

从EF 6开始

context.ChangeTracker.HasChanges()

请参阅文档

  

检查DbContext是否正在跟踪在调用SaveChanges时将发送到数据库的任何新的,已删除的或已更改的实体或关系。

DBChangeTracker Class

或者您可以从此博客中了解此方法Secrets of DetectChanges

的用法

<强>更新 对于EF 5,还有另一种选择

return this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added
                                              || e.State == EntityState.Modified
                                              || e.State == EntityState.Deleted);

这个答案不是我的,我从这个answer中接受了这个答案,所以给予合适的人信任。

答案 2 :(得分:0)

可以使用Equals方法和IEquatable<T>接口来了解两个对象是否相等,但它们不允许您知道对象之间的差异。