![](/img/trans.png)
[英]Copying data between models and saving children without entities duplicating themselves in Entity Framework
[英]Duplicating Entity Framework entities
我有这个 EF 查询:
var records = mydata.Where(a => some condition).ToList();
Records 是Record
对象的列表。 Record
是一个数据库表,具有称为“关系”的一对多关系。
EF 对象将该成员变量表示为Collection<Relation>
。
在上面的where
之后,我看到“relation”成员变量包含 18 个实体的集合。
我需要复制这些Record
对象,以便我首先分离它们,如下所示:
var detached = this.DetachEntities(records, db, "RecordId");
以这种方式定义this.DetachEntities
地方:
private T DetachEntity<T>(T entity, Repositories.GestionActivosEntities db, string keyName) where T : class
{
db.Entry(entity).State = EntityState.Detached;
if (entity.GetType().GetProperty(keyName) != null)
{
entity.GetType().GetProperty(keyName).SetValue(entity, 0);
}
return entity;
}
private List<T> DetachEntities<T>(List<T> entities, Repositories.GestionActivosEntities db, string keyName) where T : class
{
foreach (var entity in entities)
{
this.DetachEntity(entity, db, keyName);
}
return entities;
}
分离实体后,我正在执行以下操作:
db.Record.AddRange(detached);
问题是,在我分离列表后,关系也不会被复制,导致“关系”成员变量不包含任何元素。
分离后如何保留关系元素?
编辑:
这显示了调试会话:
断点放置在完成查询的行中。 光标显示执行查询后的行。
此屏幕截图显示了子记录 ValorCampo 和 Workflow
此屏幕截图显示了分离后的实体。 注意子记录不存在于分离的对象中
正如我所说,问题仅在于分离时。 不保留儿童记录。 数据库行保持不变。
我遇到了同样的问题,不幸的是,在分离项目或实体状态更改为分离后,导航属性丢失。
你可以做的是克隆实体,一种方法是: Context.Entry(your_entity).CurrentValues.ToObject();
但是这也不会克隆导航属性
如果你完全想在导航属性中克隆一个对象,我实现它的最简单方法是使用 c# 的 automapper 库
下面是一个示例用法:
var config = new MapperConfiguration(cfg => cfg.CreateMap<originalObject, T>());
var mapper = new Mapper(config);
// or
var mapper = config.CreateMapper();
T clonedObject = mapper.Map<T>(originalObject);
克隆和分离原始对象后,您可以添加
db.Record.AddRange(clonedObject );
下面是一个通用的扩展来做到这一点
public static object Map<T>(this T source)
{
var fullName = source.GetType().FullName;
var sourceType = source.GetType();
var baseType = ObjectContext.GetObjectType(source.GetType());
var config = new MapperConfiguration(cfg =>
cfg.CreateMap(sourceType, baseType));
var mapper = config.CreateMapper();
var entity = mapper.Map(source, sourceType, baseType);
return entity;
}
你可以这样称呼它
var clonedObject = originalObject.Map();
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.