2016-11-23 52 views
0

作爲示例,假設我有一個包含100個屬性的類。在第一次插入時,所有屬性都用值填充。如何更新但清除EF中的現有值

但是,我然後更新類只有一個屬性值,但我只想現在存儲此值並清除所有其他字段。我試着檢查記錄是否存在,如果存在,然後實例化一個具有相同ID的新記錄,只更改一個字段,但看起來EF保留了數據庫中所有當前/未觸及的屬性值。

在EF中這樣做有一個簡潔的方法,而不必訴諸清理更新的每個字段?

+0

請提供一些代碼。如果'Employee'是具有'Id,Name,Address,Age等'的實體,並且如果您想更新Name並將其他人設置爲空,那麼 - (假設您的員工ID爲10) - var employee = new Employee {Id = 10,Name =「更新名稱」}; dbContext.Entry(employee).State = EntityState.Modified; dbContext.SaveChanges();' – Developer

+0

我試過這個,但它不起作用。我認爲這是因爲你在課堂上設置了修改後的狀態,所以它適用於所有的屬性。 – user183872

+0

是的,你需要什麼? – Developer

回答

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(); 
0

如果EmployeeId, 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; 
+0

問題是我已經需要在記錄上進行獲取以獲取ID。另一件事是,如果我沒有執行讀取操作並只是附加修改後的記錄,那麼它仍然會更新已更改的屬性,但所有其他屬性仍然保留在數據庫中。我想清除所有其他字段。也許使用Employee是一個壞例子,因爲我的要求不是通常的CRUD場景。您上面的每個屬性上的修改標誌都可以工作,但這意味着每個屬性都有這一行代碼。我的解決方案只有幾行。 – user183872