代码之家  ›  专栏  ›  技术社区  ›  jstuardo

复制实体框架实体

  •  0
  • jstuardo  · 技术社区  · 6 年前

    我有这个问题:

    var records = mydata.Where(a => some condition).ToList();
    

    记录是一个列表 Record 是一个具有一对多关系(称为“关系”)的数据库表。

    EF对象将该成员变量表示为 Collection<Relation> .

    之后 where

    记录 对象,以便我首先将其拆离,方法如下:

    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 instructions 2 show the problem

    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

    正如我所说,问题只在于拆卸时。未保存儿童记录。数据库行保持不变。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Asım Gündüz    6 年前

    一种方法是: Context.Entry(your_entity).CurrentValues.ToObject();

    如果您完全希望克隆具有导航属性的对象

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