当前位置: 首页 > 编程语言 > C#

使用Automapper将DTO映射到实体共享

时间:2023-04-10 20:40:12 C#

使用Automapper将DTO映射到实体我有一个具有以下结构的实体框架POCO。publicclassEntity{publicvirtualintId{get;放;}publicvirtualstringName{get;放;我为此实体创建了一个数据传输对象以供我的视图使用。publicclassEntityDto{publicintId{get;放;}公共字符串名称{得到;放;现在,我在Global.asax文件中有以下映射代码。映射器.CreateMap();映射器.CreateMap();//不确定我是否也需要这个?一切正常,我将DTO传递给我的视图好的,我可以从我的EntityDto模型创建一个新的Entity实例。当我尝试编辑我的实体时出现问题;我知道这是由于AutoMapper丢失了EF创建的用于跟踪对象更改的EntityKey,但阅读多个来源似乎并不是一个确定的解决方案。这是我用来编辑实体的操作。publicActionResultEditEntity(EntityDtomodel){varentity=context.Entities.Single(e=>e.Id==model.Id);entity=Mapper.Map(模型);//这会丢失EntityKey内容context.SaveChanges();返回视图(模型);现在,我该怎么做才能解决这个问题?我可以:以某种方式告诉AutoMapper.Ignore()实体键属性吗?让AutoMapper复制实体键属性?.Attach()我的映射实体并将状态设置为已修改?任何帮助总是感激。.Attach()我的映射实体并将状态设置为已修改?publicActionResultEditEntity(EntityDtomodel){varentity=Mapper.Map(model);context.Set().Attach(实体);//(或context.Entity.Attach(entity);)context.Entry(entity)。State=System.Data.EntityState.Modified;context.SaveChanges();返回视图(模型);你的上下文在哪里实例化?您应该在EditEntity操作imo中执行此操作。publicActionResultEditEntity(EntityDtomodel){using(varcontext=newMyContext()){varentity=Mapper.Map(model);context.Set().Attach(实体);//(或context.Entity.Attach(entity);)context.Entry(entity).State=System.Data.EntityState.Modified;context.SaveChanges();返回视图(模型);尝试将实体作为第二个参数传递给您的地图。entity=Mapper.Map(model,entity);否则,您的实体实例将被新实例覆盖,并且您将丢失在第一行中创建的实体。另一个不需要Automapper进行DTO到实体转换的答案是使用DbEntry:varoldEntity=DbSet.FirstOrDefault(x=>x.Id==updatedEntity.Id);varoldEntry=Context.Entry(oldEntity);oldEntry.CurrentValues。设置值(更新实体);您不需要任何附加/状态检查,因为您首先获得旧实体,因此它附加了更改跟踪。还有,CurrentValues.SetValues可以接受不同的类型,在这个例子中updatedEntity是一个DTO。SetValues文档解释如下:通过读取给定对象的值来设置这个字典的值。给定的对象可以是任何类型。将读取名称与字典中的属性名称匹配且可以读取的对象上的任何属性。其他属性将被忽略。例如,这允许从简单的数据传输对象(DTO)复制属性。所以它似乎已经可以在自动化程序中执行。以上就是C#学习教程:使用Automapper将DTO映射到实体共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: