ChangeTracker
introduzione
ChangeTracker
classe ChangeTracker
consente di accedere alle informazioni e alle operazioni di rilevamento delle modifiche per le istanze di entità che il contesto sta monitorando. In EF Core, DbContext include la classe ChangeTracker e avvia il tracciamento di tutte le entità non appena viene recuperata utilizzando DbContext.
Change Tracker traccia un'entità utilizzando uno dei seguenti stati:
- aggiunto
- immutato
- Modificato
- eliminata
- Distaccato
aggiunto
L'entità viene tracciata dal contesto ma non esiste ancora nel database. Se una nuova entità o entità sono aggiunte nel contesto usando il metodo Add()
, allora sarà contrassegnato come Aggiunto.
using (var context = new MyContext())
{
var customer = new Customer
{
FirstName = "Thomas",
LastName = "Hardy",
Address = "120 Hanover Sq."
};
context.Customers.Add(customer);
foreach (var entry in context.ChangeTracker.Entries())
{
Console.WriteLine("Entity: {0}, State: {1} ", entry.Entity.GetType().Name, entry.State.ToString());
}
}
eliminata
L'entità viene tracciata dal contesto ed esiste nel database. Se qualsiasi entità viene rimossa da DbContext utilizzando il metodo Remove()
, verrà contrassegnata come Eliminata.
using (var context = new MyContext())
{
var customer = context.Customers
.Where(c => c.FirstName == "Thomas")
.FirstOrDefault();
context.Customers.Remove(customer);
foreach (var entry in context.ChangeTracker.Entries())
{
Console.WriteLine("Entity: {0}, State: {1} ", entry.Entity.GetType().Name, entry.State.ToString());
}
}
Distaccato
Se l'entità o le entità create o recuperate dall'ambito dell'istanza di DbContext corrente, verranno contrassegnate come Staccate.
var customer = new Customer
{
FirstName = "Elizabeth",
LastName = "Lincoln",
Address = "23 Tsawassen Blvd."
};
using (var context = new MyContext())
{
Console.Write(context.Entry(customer).State);
}
Le entità non vengono tracciate da un'istanza di DbContext esistente vengono anche chiamate entità disconnesse.
Modificato
L'entità viene tracciata dal contesto ed esiste nel database. L'entità verrà contrassegnata come Modificata se il valore di qualsiasi proprietà di un'entità viene modificato nell'ambito di DbContext.
using (var context = new MyContext())
{
var customer = context.Customers
.Where(c => c.FirstName == "Thomas")
.FirstOrDefault();
customer.LastName = "Anders";
Console.Write(context.Entry(customer).State);
}
immutato
L'entità viene tracciata dal contesto ed esiste nel database. Quando l'entità o le entità vengono recuperate utilizzando la query SQL raw o le query LINQ-to-Entities avranno lo stato Unchanged.
using (var context = new MyContext())
{
var customer = context.Customers
.Where(c => c.FirstName == "Mark")
.FirstOrDefault();
Console.Write(context.Entry(customer).State);
}