举个例子,假设我有100个属性的类。在第一个插入中,所有属性都填充了值。
然而,我只用一个属性值更新了类,但我现在只想存储这个值并清除所有其他字段。我尝试检查记录是否存在,如果存在,然后实例化具有相同ID的新记录并只更改一个字段,但看起来EF保留了数据库中所有当前/未触摸的属性值。
是否有简洁的方法在EF中执行此操作,而无需诉诸清除更新中的每个字段?
答案 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;