我有这个EF查询:
var records = mydata.Where(a => some condition).ToList();
记录是Record
对象的列表。 Record
是一个具有一对多关系的数据库表,称为“关系”。
EF对象将该成员变量表示为Collection<Relation>
。
在上面的where
之后,我看到“关系”成员变量包含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);
问题是,在我分离列表之后,该关系也没有被复制,导致“ relation”成员变量不包含任何元素。
分离后如何保留关系元素?
编辑:
这显示了调试会话:
断点放置在查询完成的行中。光标显示执行查询后的行。
此屏幕截图显示了子记录ValorCampo和Workflow
此屏幕截图显示了分离后的实体。请注意,子记录不在分离对象中
正如我所告诉的,问题仅在于分离时。子记录不会保留。数据库行保持不变。
答案 0 :(得分:0)
我遇到了同样的问题,不幸的是,分离项目后或实体状态更改为分离后,导航属性会丢失。
您可以做的就是克隆实体
一种方法是: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();
希望这会有所帮助!