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

自动制表符。集合。实体框架

  •  1
  • tsage080667  · 技术社区  · 6 年前

    用不同的方式问同样的问题!

    很明显,我需要详细阐述这个问题,因为我没有可行的答案。

    基于此AutoMapper注册码:

    Mapper.Initialize(cfg =>
    {
       cfg.AddCollectionMappers();
       cfg.SetGeneratePropertyMaps<GenerateEntityFrameworkPrimaryKeyPropertyMaps<DbContext>>();
     });
    

    AutoMapper使用以下行添加对“更新”数据库集集合的支持:

    Mapper.Map<List<DTO>, List<Entity>>(dtoCollection, entityCollection);
    

    通过开放上下文保存更改应导致更新数据库:

    using (var context = factory.CreateContext())
    {
      Mapper.Map<List<DTO>, List<Entity>>(dtoCollection, await 
      context.dbSet.TolistAsync());
      await context.SaveChangesAsync();
    }
    

    这没什么用!

    回到我原来的问题上来。如果使用dto和实体集合的当前状态调用映射器,则返回基于此处创建的比较映射的更新实体集合:

    cfg.SetGeneratePropertyMaps<GenerateEntityFrameworkPrimaryKeyPropertyMaps<DbContext>>();
    

    在此处生成实体集合:

    var entities =  Mapper.Map<List<DTO>, List<Entity>>(dtoCollection, await 
    context.dbSet.TolistAsync());
    

    我是否支持使用此新集合迭代新集合并手动更新EF?现在还不清楚我该怎么办?这就是我对最终的收藏要做的吗?

            // map dto's to entities
            var entities = Mapper.Map(collection, await dbSet.ToListAsync());
    
            // add new records
            var toAdd = entities.Where(e => e.Id == 0);
            dbSet.AddRange(toAdd);
    
            // delete old records   
            var toDelete = entities.Where(entity => collection.All(e => e.Id > 0 && e.Id != entity.Id));
            dbSet.RemoveRange(toDelete);
    
            // update existing records
            var toUpdate = entities.Where(entity => collection.All(i => i.Id > 0 && i.Id == entity.Id)).ToList();
            foreach (var entity in toUpdate)
            {
                context.Entry(entity).State = EntityState.Modified;
            }
    
            await context.SaveChangesAsync();
    

    这是我最初的问题。如果是这样的话,这似乎是多余的。所以我觉得我错过了什么。

    我感谢一些有用的反馈。请帮忙!

    谢谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ivan Stoev    6 年前

    EF公司 DbSet s不是集合。基本上,它们表示一个数据库表,并为其提供查询和DML操作。

    似乎要将整个表与DTO列表同步。可以通过使用 Load LoadAsync 方法,然后 Map 实体的DTO集合 DbSet.Local 所有物与您的尝试不同的是 Local 属性不是简单的列表,而是直接绑定到上下文本地存储和更改跟踪器的可观察集合,因此任何修改( Add ,则, Remove )将应用于数据库。

    类似这样:

    await dbSet.LoadAsync();
    Mapper.Map(dtoCollection, dbSet.Local);
    await context.SaveChangesAsync();