如何更新但清除EF中的现有值

时间:2016-11-23 11:37:30

标签: .net entity-framework

举个例子,假设我有100个属性的类。在第一个插入中,所有属性都填充了值。

然而,我只用一个属性值更新了类,但我现在只想存储这个值并清除所有其他字段。我尝试检查记录是否存在,如果存在,然后实例化具有相同ID的新记录并只更改一个字段,但看起来EF保留了数据库中所有当前/未触摸的属性值。

是否有简洁的方法在EF中执行此操作,而无需诉诸清除更新中的每个字段?

2 个答案:

答案 0 :(得分:0)

我认为这是如何实现它的。有效地创建一个全新的课程,取消前者并附加后者,就可以了。

 var currentEmployee = _db.Employees.Single(x=>x.Id == employeeId);
 _db.Entry<Employee>(currentEmployee).State = EntityState.Detached;

 // create new one with the correct ID to update
 var updateEmployee = new Employee();
 updateEmployee.Id = currentEmployee.Id;                        

 // map values over and ensure EF is aware of modifications
 updateEmployee.FirstName = "John";
 updateEmployee.Surname = "Smith";                       
 _db.Entry<Employee>(updateEmployee).State = EntityState.Modified;
 _db.SaveChanges();

答案 1 :(得分:0)

如果Employee是您的Id, Name, Address, Age etc实体,并且您想要更新Name并将其他人设为空,那么 - (假设您的员工ID为10) -

var employee = new Employee {Id = 10, Name = "Updated Name"};
dbContext.Entry(employee).State = EntityState.Modified;
dbContext.SaveChanges();

回复您发布的答案 在更新之前,您不必进行获取(从数据库获取实体)。当您执行var currentEmployee = _db.Employees.Single(x=>x.Id == employeeId);时 - 实体将保留在上下文中,并且更改跟踪器将跟踪对该实体所做的任何更改。这意味着,如果您更新名称currentEmployee.Name = "new name" - 更改跟踪器会将此属性标记为Modified,并且只会对此属性进行更新。您必须分离 - _db.Entry<Employee>(currentEmployee).State = EntityState.Detached;,因为该实体在获取后已附加到上下文。

我建议你避免get / fetch请求(避免不必要的数据库命中)并更新我在答案中提到的属性。

var employee = new Employee {Id = 10, Name = "Updated Name"};
dbContext.Entry(employee).State = EntityState.Modified;
dbContext.SaveChanges(); 

上面的代码将按预期工作 - 确保数据库中已存在Id = 10,否则会抛出错误。

只需要几个额外的信息,如果您想单独更新Name属性并保持其他属性不变,那么您可以执行以下操作(此方法还可以避免额外的数据库命中以获取实体):< / p>

var employee = new Employee {Id = 10};
dbContext.Employees.Attach(employee);
employee.Name = "Updated Name";
dbContext.SaveChanges();

如果您已经在方法中收到了更新名称的Employee对象,则:

//assuming employee object has an valid Id/primary key
Context.Entry(employee).Property(e=>e.Name).IsModified = true;