Asp.net mvc 3 如何将此EF克隆代码转换为使用DBContext而不是EntityObject?
我需要克隆主实体和子实体。我在CodeProject上遇到了这个解决方案,它似乎可以完成这项工作,请参阅: 然而,我使用的是EF5和DBContext,而这段代码使用的是EF4和EntityObject,所以我想知道需要对其进行哪些更改 代码是:Asp.net mvc 3 如何将此EF克隆代码转换为使用DBContext而不是EntityObject?,asp.net-mvc-3,entity-framework,entity-framework-4,entity-framework-5,Asp.net Mvc 3,Entity Framework,Entity Framework 4,Entity Framework 5,我需要克隆主实体和子实体。我在CodeProject上遇到了这个解决方案,它似乎可以完成这项工作,请参阅: 然而,我使用的是EF5和DBContext,而这段代码使用的是EF4和EntityObject,所以我想知道需要对其进行哪些更改 代码是: public static T CopyEntity<T>(MyContext ctx, T entity, bool copyKeys = false) where T : EntityObject { T clone = ctx.Cre
public static T CopyEntity<T>(MyContext ctx, T entity, bool copyKeys = false) where T : EntityObject
{
T clone = ctx.CreateObject<T>();
PropertyInfo[] pis = entity.GetType().GetProperties();
foreach (PropertyInfo pi in pis)
{
EdmScalarPropertyAttribute[] attrs = (EdmScalarPropertyAttribute[])
pi.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false);
foreach (EdmScalarPropertyAttribute attr in attrs)
{
if (!copyKeys && attr.EntityKeyProperty)
continue;
pi.SetValue(clone, pi.GetValue(entity, null), null);
}
}
return clone;
我在这里发帖是因为这篇文章的反馈看起来不活跃,我相信这是一个任何EF专业人士都可以回答的问题
非常感谢 如果希望使用EF5
DbContext
克隆实体,最简单的方法是:
//clone of the current entity values
Object currentValClone = context.Entry(entityToClone)
.CurrentValues.ToObject();
//clone of the original entity values
Object originalValueClone = context.Entry(entityToClone)
.OriginalValues.ToObject();
//clone of the current entity database values (results in db hit
Object dbValueClone = context.Entry(entityToClone)
.GetDatabaseValues().ToObject();
只有在实体属性中有
EdmScalarPropertyAttribute
或者,您可以使用MetadataWorkspace
获取实体属性
public static class EntityExtensions
{
public static TEntity CopyEntity<TEntity>(DbContext context, TEntity entity, bool copyKeys = false)
where TEntity : class
{
ObjectContext ctx = ((IObjectContextAdapter)context).ObjectContext;
TEntity clone = null;
if (ctx != null)
{
context.Configuration.AutoDetectChangesEnabled = false;
try
{
clone = ctx.CreateObject<TEntity>();
var objectEntityType = ctx.MetadataWorkspace.GetItems(DataSpace.OSpace).Where(x => x.BuiltInTypeKind == BuiltInTypeKind.EntityType).OfType<EntityType>().Where(x => x.Name == clone.GetType().Name).Single();
var pis = entity.GetType().GetProperties().Where(t => t.CanWrite);
foreach (PropertyInfo pi in pis)
{
var key = objectEntityType.KeyProperties.Where(t => t.Name == pi.Name).FirstOrDefault();
if (key != null && !copyKeys)
continue;
pi.SetValue(clone, pi.GetValue(entity, null), null);
}
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
}
return clone;
}
}
公共静态类EntityExtensions
{
公共静态TEntity CopyEntity(DbContext上下文,TEntity实体,bool copyKeys=false)
地点:班级
{
ObjectContext ctx=((IObjectContextAdapter)context).ObjectContext;
tenty克隆=null;
如果(ctx!=null)
{
context.Configuration.AutoDetectChangesEnabled=false;
尝试
{
clone=ctx.CreateObject();
var objectEntityType=ctx.MetadataWorkspace.GetItems(DataSpace.OSpace).Where(x=>x.BuiltypeKind==BuiltypeKind.EntityType).OfType().Where(x=>x.Name==clone.GetType().Name).Single();
var pis=entity.GetType().GetProperties().Where(t=>t.CanWrite);
foreach(pis中的属性信息pi)
{
var key=objectEntityType.KeyProperties.Where(t=>t.Name==pi.Name).FirstOrDefault();
if(key!=null&&!copykey)
继续;
pi.SetValue(克隆,pi.GetValue(实体,null),null);
}
}
最后
{
context.Configuration.AutoDetectChangesEnabled=true;
}
}
返回克隆;
}
}
谢谢您的帮助。非常有用。
public static class EntityExtensions
{
public static TEntity CopyEntity<TEntity>(DbContext context, TEntity entity, bool copyKeys = false)
where TEntity : class
{
ObjectContext ctx = ((IObjectContextAdapter)context).ObjectContext;
TEntity clone = null;
if (ctx != null)
{
context.Configuration.AutoDetectChangesEnabled = false;
try
{
clone = ctx.CreateObject<TEntity>();
var objectEntityType = ctx.MetadataWorkspace.GetItems(DataSpace.OSpace).Where(x => x.BuiltInTypeKind == BuiltInTypeKind.EntityType).OfType<EntityType>().Where(x => x.Name == clone.GetType().Name).Single();
var pis = entity.GetType().GetProperties().Where(t => t.CanWrite);
foreach (PropertyInfo pi in pis)
{
var key = objectEntityType.KeyProperties.Where(t => t.Name == pi.Name).FirstOrDefault();
if (key != null && !copyKeys)
continue;
pi.SetValue(clone, pi.GetValue(entity, null), null);
}
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
}
return clone;
}
}