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);
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();
}