2011-12-14 45 views

回答

7

根據上下文的類型和生成的實體,您可以通過幾種不同的方式來完成。 對於從實體或POCO繼承的對象,您可以使用ObjectStateManager 在自我跟蹤實體的情況下,您可以從實體本身使用跟蹤器。

請提供您如何產生的上下文的方式更多的細節和如何做變更

編輯(2): 可以查詢ObjectStateManager對改變後的條目只是這樣的:

var changed = ctx.ObjectStateManager.GetObjectStateEntries().Where(e=>e.State != EntityState.Unchanged); 

編輯( 1):

以下示例從MSDN演示如何查詢更改:

int orderId = 43680; 

using (AdventureWorksEntities context = 
new AdventureWorksEntities()) 
{ 
var order = (from o in context.SalesOrderHeaders 
      where o.SalesOrderID == orderId 
      select o).First(); 

// Get ObjectStateEntry from EntityKey. 
ObjectStateEntry stateEntry = 
    context.ObjectStateManager 
    .GetObjectStateEntry(((IEntityWithKey)order).EntityKey); 

//Get the current value of SalesOrderHeader.PurchaseOrderNumber. 
CurrentValueRecord rec1 = stateEntry.CurrentValues; 
string oldPurchaseOrderNumber = 
    (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); 

//Change the value. 
order.PurchaseOrderNumber = "12345"; 
string newPurchaseOrderNumber = 
    (string)rec1.GetValue(rec1.GetOrdinal("PurchaseOrderNumber")); 

// Get the modified properties. 
IEnumerable<string> modifiedFields = stateEntry.GetModifiedProperties(); 
foreach (string s in modifiedFields) 
    Console.WriteLine("Modified field name: {0}\n Old Value: {1}\n New Value: {2}", 
     s, oldPurchaseOrderNumber, newPurchaseOrderNumber); 

// Get the Entity that is associated with this ObjectStateEntry. 
SalesOrderHeader associatedEnity = (SalesOrderHeader)stateEntry.Entity; 
Console.WriteLine("Associated Enity's ID: {0}", associatedEnity.SalesOrderID); 
} 
+0

使用嚮導從db生成模型,典型代碼repo.entity.value = newvalue進行更改 – Kumar 2011-12-14 18:02:47

+0

請參閱擴展答案 – vittore 2011-12-14 19:36:50

2

通過使用數據庫結構本身通常是一種很好的做法。 這只是您現在擁有的另一種方法。

您可以在名爲ModifiedOn的表中創建類型爲datetime的新字段,並在每次更新數據庫中的行時對其進行更新。

然後當你要更改的行的具體時間後,你只需使用:

where ModifiedOn > dateTime 

這只是你如何能夠從不同的角度解決這個問題的另一個建議。