我使用的是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个房产...
请问好吗?
答案 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时将发送到数据库的任何新的,已删除的或已更改的实体或关系。
或者您可以从此博客中了解此方法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>
接口来了解两个对象是否相等,但它们不允许您知道对象之间的差异。