作爲示例,假設我有一個包含100個屬性的類。在第一次插入時,所有屬性都用值填充。如何更新但清除EF中的現有值
但是,我然後更新類只有一個屬性值,但我只想現在存儲此值並清除所有其他字段。我試着檢查記錄是否存在,如果存在,然後實例化一個具有相同ID的新記錄,只更改一個字段,但看起來EF保留了數據庫中所有當前/未觸及的屬性值。
在EF中這樣做有一個簡潔的方法,而不必訴諸清理更新的每個字段?
作爲示例,假設我有一個包含100個屬性的類。在第一次插入時,所有屬性都用值填充。如何更新但清除EF中的現有值
但是,我然後更新類只有一個屬性值,但我只想現在存儲此值並清除所有其他字段。我試着檢查記錄是否存在,如果存在,然後實例化一個具有相同ID的新記錄,只更改一個字段,但看起來EF保留了數據庫中所有當前/未觸及的屬性值。
在EF中這樣做有一個簡潔的方法,而不必訴諸清理更新的每個字段?
我認爲這是如何實現它。有效地創建一個全新的班級,將前者與前者聯繫起來,並依靠後者來完成這項工作。
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();
如果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;
,因爲該實體在獲取後已附加到上下文。
我建議你避免獲取/獲取請求(避免不必要的數據庫命中)並更新屬性,正如我在我的答案中所述。
var employee = new Employee {Id = 10, Name = "Updated Name"};
dbContext.Entry(employee).State = EntityState.Modified;
dbContext.SaveChanges();
上面的代碼將工作像您期望的 - 確保該Id = 10
在數據庫中已經存在,否則這將拋出錯誤。
只是一些額外的信息,如果你想獨自更新Name
財產,並保持其他不變,那麼你可以做類似下面(這種做法也避免了額外的數據庫命中用於獲取實體):
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;
問題是我已經需要在記錄上進行獲取以獲取ID。另一件事是,如果我沒有執行讀取操作並只是附加修改後的記錄,那麼它仍然會更新已更改的屬性,但所有其他屬性仍然保留在數據庫中。我想清除所有其他字段。也許使用Employee是一個壞例子,因爲我的要求不是通常的CRUD場景。您上面的每個屬性上的修改標誌都可以工作,但這意味着每個屬性都有這一行代碼。我的解決方案只有幾行。 – user183872
請提供一些代碼。如果'Employee'是具有'Id,Name,Address,Age等'的實體,並且如果您想更新Name並將其他人設置爲空,那麼 - (假設您的員工ID爲10) - var employee = new Employee {Id = 10,Name =「更新名稱」}; dbContext.Entry(employee).State = EntityState.Modified; dbContext.SaveChanges();' – Developer
我試過這個,但它不起作用。我認爲這是因爲你在課堂上設置了修改後的狀態,所以它適用於所有的屬性。 – user183872
是的,你需要什麼? – Developer