Entity Framework Update check if the record has changed

entity-framework

Question

I am updating a database table using EF.

Its a simple scenario in connected mode.

I get the row I want to update

var order = from o in Orders
        where o.ID = 1
        select o;

I then update the record as:

order.FirstName = "First";
order.LastName = "Last";
context.SaveChanges();

It works fine. EF checks if the field has changed and only updates the field if its a new value. I have enabled CDC on my SQL server to check that EF does not rewrite to the database if the value has not changed.

Now I want to put this check in my code for additional logic i.e. I want EF to tell me when the record was updated, and when it was not (because the value has not changed). Can anyone please tell if there is a way?

I do not want to manually check each field as I have a lot of fields to compare.

Thanks

1
4
7/16/2012 11:58:51 AM

Accepted Answer

If anybody is interested here is what I did. I created the following method to check if any field has changed before saving changes.

private Dictionary<Type, bool> IsEntityModified()
    {
        Dictionary<Type, bool> entity = new Dictionary<Type, bool>();
        var items = _bentities.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
        foreach (ObjectStateEntry entry in items)
        {
            foreach (string propName in entry.GetModifiedProperties())
            {
                string oldsetterValue, newsetterValue = null;
                //Get orginal value 
                oldsetterValue = entry.OriginalValues[propName].ToString();
                //Get new value 
                newsetterValue = entry.CurrentValues[propName].ToString();

                if (oldsetterValue != newsetterValue)
                {
                    entity.Add(entry.Entity.GetType(), true);
                }
            }
        }
        return entity;
    }
7
7/17/2012 9:56:47 AM

Popular Answer

I came across this question/answer when I was looking for something similar if not the same thing. I ended up using this approach which seems to work alright for me.

var order = from o in context.Orders
        where o.ID = 1
        select o;

order.FirstName = "First";
order.LastName = "Last";

if (context.Entry(order).State != EntityState.Unchanged)
{
    // order has changed ...
}

So posting what worked for me in case it might be helpful for others who come here looking for something similar.



Related Questions





Related

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