65.9K
CodeProject is changing. Read more.
Home

Extension Method to help with EF Code First updating

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Oct 24, 2011

CPOL
viewsIcon

17870

An Extension Method that might help you copy over the values from one object to another, provided they are of the same type.

I just started working with EF Code First and MVC 3 and I ran into a bit of trouble when updating the database with a modified entity because the entity I was receiving from the actions parameter was not the same reference as the one in the DbSet.

Here is a small extension method that might help you copy over the values from one object to another, provided they are of the same type:

public static void CopyPropertiesTo<T>(this T source, T destination) where T : class
{
    if(source == null)
    {
        throw new ArgumentNullException("source");
    }

    if (destination == null)
    {
        throw new ArgumentNullException("destination");
    }

    var fields = GetPropertyValues(source);
    // Get property values.
    var properties = FormatterServices.GetObjectData(source, fields);
    FormatterServices.PopulateObjectMembers(destination, fields, properties);
}

private static MemberInfo[] GetPropertyValues<T>(T source) where T : class
{
    var fieldList = new List<MemberInfo>();
    var instanceType = source.GetType();
    while (instanceType != null && instanceType != typeof (Object))
    {
        fieldList.AddRange(instanceType.GetFields(BindingFlags.Public | 
                                                  BindingFlags.NonPublic | 
                                                  BindingFlags.Instance | 
                                                  BindingFlags.DeclaredOnly));
        instanceType = instanceType.BaseType;
    }

    return fieldList.ToArray();
}

You can then use it as follows:

public ActionResult Edit(Entity entity)
{
    var entityInDbSet = _context.Set.SingleOrDefault(x => x.Id == entity.Id);
    entity.CopyPropertiesTo(entityInDbSet);

    _context.SaveChanges();
}