加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

实体框架 – ASP.NET OData – 使用带数据传输对象的Delta实现PA

发布时间:2020-12-16 03:29:09 所属栏目:asp.Net 来源:网络整理
导读:在我的OData控制器中,我将我的EF实体转换为DTO,因为该实体包含许多UI未使用的字段. 此问答(ASP.NET WebApi OData support for DTOs)显示了如何将OData URI中的查询选项应用于EF查询并返回DTO.这很好,这意味着我可以获得查询数据库的好处以及序列化较小实体的
在我的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一起使用时,请注意导航属性的自动扩展.
您可以使用ExplicitExpansion方法禁用扩展:

Mapper.CreateMap<DbEntity,DtoEntity>()
            .ForMember(dest => dest.Example,opt => opt.ExplicitExpansion());

我还必须使用Configuration.LazyLoadingEnabled = false禁用Lazy Loading;在我的DbContext构造函数中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读