繁体   English   中英

复制实体框架实体

[英]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);

问题是,在我分离列表后,关系也不会被复制,导致“关系”成员变量不包含任何元素。

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

编辑:

这显示了调试会话:

2 说明 2 显示问题

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

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

此屏幕截图显示了子记录 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM