2011-12-14 17 views

Respuesta

7

Según el tipo de contexto y las entidades generadas, puede hacerlo de diferentes maneras. En el caso de objetos heredados de Entity o POCO, puede usar ObjectStateManager en el caso de las entidades de seguimiento automático, puede usar Tracker desde la propia entidad.

proporcione más detalles sobre la forma en cómo usted generó contexto y cómo se realizan cambios

editada (2): se puede consultar ObjectStateManager de entradas cambiadas simplemente como esta:

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

editada (1):

El siguiente ejemplo de MSDN demuestran cómo consultar para cambios:

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

generado el modelo desde db usando el asistente, código típico repo.entity.value = newvalue para hacer cambios – Kumar

+0

ver respuesta extendida – vittore

+0

interesante, ¿se escala a varias filas como si la "tabla" está vinculada a una cuadrícula y el el usuario hace cambios a una fila pero no sé cuál de antemano !! o necesito obtener & almacenar ObjectStateEntry para cada registro en la lista (que podría tener fácilmente> 10000 entradas) – Kumar

2

Comúnmente es una buena práctica hacer esto utilizando la propia estructura de la base de datos. Este es solo otro acercamiento al que tienes ahora.

Puede crear un nuevo campo de tipo datetime en una tabla llamada por ejemplo ModifiedOn y actualizarla cada vez que actualice la fila en la base de datos.

Luego, cuando se desea que las filas cambiadas después de un tiempo específico que acaba de utilizar:

where ModifiedOn > dateTime 

Es sólo otra sugerencia sobre cómo se puede abordar el problema desde un ángulo diferente.

+0

en general, ni siquiera necesita hacerlo manualmente actualice el campo, hay un tipo de campo dedicado para eso - marca de tiempo. este enfoque tiene mucho sentido, pero solo le permite obtener el tiempo de los cambios. usted todavía necesita obtener los cambios reales, lo que puede hacer simplemente persistiendo el registro original junto con uno nuevo o utilizando enfoques más sofisticados, como el registro quering (en SQL Server). Por otro lado, EntityFramework ya contiene esta información antes de realizar la actualización a la base de datos, por lo que usar estos datos existentes es una decisión bastante obvia – vittore

+0

@vittore - Verdadero. Estoy totalmente de acuerdo contigo. Solo quería señalar que para este problema en particular hay otros enfoques. – TheBoyan

Cuestiones relacionadas