实体框架 – ASP.NET OData – 使用带数据传输对象的Delta实现PA
在我的OData控制器中,我将我的EF实体转换为DTO,因为该实体包含许多UI未使用的字段.
此问答(ASP.NET WebApi OData support for DTOs)显示了如何将OData URI中的查询选项应用于EF查询并返回DTO.这很好,这意味着我可以获得查询数据库的好处以及序列化较小实体的好处. 但是,当我需要更新时,如何将带有修补字段的Delta应用于我的实体? 实体中的字段名称与DTO不匹配. 我可以使用Delta中已更改的字段集合,但之后我将映射所有字段名称并使用反射来更新实体中的所有属性. 有没有更好的办法? 我应该使用我的实体而不是DTO,并使用odata $select参数来减少线上数据的大小. 我是否应该恢复到WebAPI并具有单独的更新函数,这些函数仅采用所需的参数,例如UpdateStartDate(int id,DateTime newStartDate) 解决方法
我刚遇到同样的问题,发现以下链接有用:
http://qimata.com/?p=1381
为了繁荣,下面是使用AutoMapper将数据库实体映射到DTO的代码,然后将修补应用于DTO对象,然后使用AutoMapper在保存之前映射回数据库实体: [AcceptVerbs("PATCH","MERGE")] public virtual async Task<IHttpActionResult> Patch([FromODataUri] int key,Delta<DtoEntity> delta,CancellationToken cancellationToken) { Validate(delta.GetEntity()); if (!ModelState.IsValid) { return BadRequest(ModelState); } var entity = await _genericRepository.FindAsync(cancellationToken,key); var dto = Mapper.Map<DtoEntity>(entity); delta.Patch(dto); Mapper.Map(dto,entity); await _context.SaveChangesAsync(cancellationToken); return Updated(dto); } 值得一提的另一件事是,在将AutoMapper与EntityFramework一起使用时,请注意导航属性的自动扩展. Mapper.CreateMap<DbEntity,DtoEntity>() .ForMember(dest => dest.Example,opt => opt.ExplicitExpansion()); 我还必须使用Configuration.LazyLoadingEnabled = false禁用Lazy Loading;在我的DbContext构造函数中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.net vNext和Entity Framework 6
- asp.net – 在没有完全回发的情况下,在AJAX更新面
- asp.net-mvc – 在Controller或其他地方渲染部分
- asp.net-mvc-3 – .NET MVC 3自定义十进制?模型
- asp.net – 如何使Owin自主主机支持Json输出?
- asp.net-mvc – 使用来自MVC的SAML和Okta进行身份
- asp.net – 获取Gridview的Selected行
- asp.net 文章内容分页显示的代码
- asp.net – .Net SQL Server连接字符串 – 隐藏其
- .net – 按enter按钮的同时选择按钮