I need to set an EntityObject\'s EntityKey. I know its type and its id value. I don\'t want to query the database unnecessarily.
This works...
//
//
Improving upon Steve Willcock's great implementation, here's my suggestion.
It uses Reflection (a part of .NET) way more than the original example, to save you some code. It also automatically supports any type of entity class, and not just a "Department".
Furthermore, it gets rid of the obsolete ApplyPropertyChanges
method, and uses the new ApplyCurrentValues
method.
The method
The method basically just uses reflection to get the value of the "Id" property dynamically, and setting it too. This saves all the hassle with a delegate.
public static void ApplyDetachedPropertyChanges(this ObjectContext db, T entity) where T : EntityObject
{
PropertyInfo idProperty = typeof(T).GetProperty("Id");
var entitySetName = db.DefaultContainerName + "." + entity.GetType().Name;
var id = idProperty.GetValue(entity, null);
var entityKey = new EntityKey(entitySetName, "Id", id);
Type type = entity.GetType();
EntityObject obj = (EntityObject)Activator.CreateInstance(type);
idProperty.SetValue(obj, id, null);
obj.EntityKey = entityKey;
db.Attach(obj);
db.AcceptAllChanges();
db.ApplyCurrentValues(entitySetName, entity);
}
Usage
Using it is pretty simple as well.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
db.ApplyDetachedPropertyChanges(Model);
db.SaveChanges();
}