Is it possible to get all the monitored things from a DbContext?

c# entity-framework


Many of the tables in my database need to have a "DateCreated" and "DateModified" column. I want to update these columns whenever SaveChanges() is called.

All my model objects inherit from a class AbstractModel to allow this kind of behavior. The class looks like this:

public abstract class AbstractModel {
    public virtual void UpdateDates() { }

I then plan to override UpdateDates() in any child classes that have DateCreated and DateModified fields they need to maintain.

To use this, I need to be able to get a list of all the entities that the DbContext is tracking, and call UpdateDates() on them if the object is marked as being Added or Modified.

I can't seem to get access to wherever DbContext is storing this information. I can do dbContext.Entry(object).State to get the EntityState of a single entity, but I can't work out how to get a list of all tracked entities.

How do I do this?

4/12/2012 11:16:22 AM

Accepted Answer

I think you can use the ChangeTracker for this:

public class MyContext : DbContext

    public override int SaveChanges()
        foreach (var dbEntityEntry in ChangeTracker.Entries<AbstractModel>())
        return base.SaveChanges();

4/12/2012 11:28:08 AM

Popular Answer

The accepted solution here is better for above EF4 than the ObjectContext suggestion - we ran into issues with for instance the in memory db we used in the test context not working well with the above solution (getting Detached state for some modified entries in inheritance scenarios). This solution uses the DbContext native way of retrieving the tracked entities:

        .Where (t => t.State == EntityState.Modified)

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow