复制实体框架实体

时间:2019-12-18 22:23:47

标签: c# entity-framework-6

我有这个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”成员变量不包含任何元素。

分离后如何保留关系元素?

编辑:

这显示了调试会话:

2 instructions 2 show the problem

断点放置在查询完成的行中。光标显示执行查询后的行。

此屏幕截图显示了子记录ValorCampo和Workflow

This screenshot shows the child records ValorCampo and Workflow

此屏幕截图显示了分离后的实体。请注意,子记录不在分离对象中

This screenshot shows the entity after detaching it. Note the child records are not present in the detached object

正如我所告诉的,问题仅在于分离时。子记录不会保留。数据库行保持不变。

1 个答案:

答案 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();

希望这会有所帮助!