我使用EF6编写了以下内容,但我相信它与EF5完全兼容.代码背后的一般思想是使用
a System.Data.Metadata.Edm中的优秀类来获取导航属性并对这些属性名称使用反射来获取对象的真实属性以进行更新.
我想让我的例子尽可能通用但完整.在提问者的情况下,他显然会用“_uow.Context”替换“context”.
public class MyClass where T : class //T really needs to always be an entity,
//but I don't know a general parent type
//for that. You could leverage partial classes
//to define your own type.
{
public MyEntities context { get; set; }
public void UpdateValues(T originalEntity, T modifiedEntity)
{
//Set non-nav props
context.Entry(originalEntity).CurrentValues.SetValues(modifiedEntity);
//Set nav props
var navProps = GetNavigationProperties(originalEntity);
foreach (var navProp in navProps)
{
//Set originalEntity prop value to modifiedEntity value
navProp.SetValue(originalEntity, navProp.GetValue(modifiedEntity));
}
}
public List GetNavigationProperties(T entity)
{
List properties = new List();
//Get the entity type
Type entityType = entity.GetType();
//Get the System.Data.Entity.Core.Metadata.Edm.EntityType
//associated with the entity.
var entitySetElementType = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext.CreateObjectSet().EntitySet.ElementType;
//Iterate each
//System.Data.Entity.Core.Metadata.Edm.NavigationProperty
//in EntityType.NavigationProperties, get the actual property
//using the entityType name, and add it to the return set.
foreach (var navigationProperty in entitySetElementType.NavigationProperties)
{
properties.Add(entityType.GetProperty(navigationProperty.Name));
}
return properties;
}
}