第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 AutoMapper 添加、更新和刪除 List 中的項(xiàng)目

使用 AutoMapper 添加、更新和刪除 List 中的項(xiàng)目

C#
Qyouu 2022-07-23 17:38:07
AutoMapper 是否沒(méi)有本地方法來(lái)更新需要?jiǎng)h除、添加或更新實(shí)例的嵌套列表?我在帶有 EF Core 的 ASP.Net Core 應(yīng)用程序中使用 AutoMapper 將我的 API 資源映射到我的模型。這對(duì)我的大多數(shù)應(yīng)用程序來(lái)說(shuō)都運(yùn)行良好,但我對(duì)更新映射嵌套列表的解決方案不滿意,其中列出的實(shí)例需要保留。我不想覆蓋現(xiàn)有列表,我想刪除傳入資源中不再存在的實(shí)例、添加新實(shí)例并更新現(xiàn)有實(shí)例。型號(hào):public class MainObject{    public int Id { get; set; }    public List<SubItem> SubItems { get; set; }    }public class SubItem{    public int Id { get; set; }    public int MainObjectId { get; set; }    public MainObject MainObject { get; set; }    public double Value { get; set; }}資源:public class MainObjectResource{    public int Id { get; set; }    public ICollection<SubItemResource> SubItems { get; set; }    }public class SubItemResource{    public int Id { get; set; }    public double Value { get; set; }}控制器:public class MainController : Controller{    private readonly IMapper mapper;    private readonly IMainRepository mainRepository;    private readonly IUnitOfWork unitOfWork;    public MainController(IMapper mapper, IMainRepository mainRepository, IUnitOfWork unitOfWork)    {        this.mapper = mapper;        this.mainRepository = mainRepository;        this.unitOfWork = unitOfWork;    }    [HttpPut("{id}")]    public async Task<IActionResult> UpdateMain(int id, [FromBody] MainObjectResource mainObjectResource)    {        MainObject mainObject = await mainRepository.GetMain(id);        mapper.Map<MainObjectResource, MainObject>(mainObjectResource, mainObjectResource);        await unitOfWork.CompleteAsync();        return Ok();     }}
查看完整描述

3 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

我開(kāi)始查看AutoMapper.Collection,這確實(shí)是我希望找到的擴(kuò)展。實(shí)施后,我的列表會(huì)按照我的意愿進(jìn)行更新。配置在我的使用中很簡(jiǎn)單,因?yàn)槲抑恍枰付ㄎ业膶?duì)象的 ID。


我的啟動(dòng)配置改為:


using AutoMapper;

using AutoMapper.EquivalencyExpression;

[....]

        public void ConfigureServices(IServiceCollection services)

        {

            services.AddAutoMapper(cfg => {

                cfg.AddCollectionMappers();

                });

        }

[....]

還有我的映射配置文件:


    CreateMap<SubItem, SubItemResource>().ReverseMap()

        .EqualityComparison((sir, si) => sir.Id == si.Id);


查看完整回答
反對(duì) 回復(fù) 2022-07-23
?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

這是一個(gè)比表面上看起來(lái)更難解決的問(wèn)題。對(duì)您的列表進(jìn)行自定義映射很容易,因?yàn)槟私饽膽?yīng)用程序;AutoMapper 沒(méi)有。例如,是什么使源項(xiàng)等于目標(biāo)項(xiàng),以便 AutoMapper 能夠辨別它應(yīng)該映射現(xiàn)有的而不是添加的?PK?哪個(gè)屬性是PK?該屬性在源和目標(biāo)上是否相同?這些是您可以在 .AutoMapper 中輕松回答的問(wèn)題AfterMap,而不是 AutoMapper。

因此,AutoMapper 總是將集合映射為新項(xiàng)目。如果這不是你想要的行為,那就是這樣的事情AfterMap。還要記住,AutoMapper 并不是專門(mén)為與 EF 一起使用而設(shè)計(jì)的,這才是真正的問(wèn)題,而不是 AutoMapper。EF 的更改跟蹤是導(dǎo)致 AutoMapper 的默認(rèn)集合映射行為出現(xiàn)問(wèn)題的原因。在其他情況和場(chǎng)景中,這不是問(wèn)題。


查看完整回答
反對(duì) 回復(fù) 2022-07-23
?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

我相信我已經(jīng)實(shí)現(xiàn)了一個(gè)配置,其中我的 InputModels 和 EntityClasses 可以包含一個(gè) Id,我只需要?jiǎng)?chuàng)建一個(gè)映射配置文件并調(diào)用:Mapper.Map(inputModelClassInstance, entityClassInstance);


因此 AutoMapper 和 EF CORE 將使用我的實(shí)例的 Id 來(lái)查看它們是否相等并按預(yù)期添加、刪除或更新。


這是我所做的:


我用過(guò):https ://github.com/AutoMapper/Automapper.Collection.EFCore


(鏈接中的修改代碼):


var services = new ServiceCollection();

services

    .AddEntityFrameworkSqlServer() //Use your EF CORE provider here

    .AddDbContext<MyContext>(); //Use your context here


services.AddAutoMapper((serviceProvider, automapper) =>

{

    automapper.AddCollectionMappers();

    automapper.UseEntityFrameworkCoreModel<MyContext>(serviceProvider);

}, typeof(DB).Assembly);


var serviceProvider = services.BuildServiceProvider();

然后我CreateMap<>()的看起來(lái)像這樣:


CreateMap<InputModelClass, EntityClass>(MemberList.Source);

CreateMap<ChildInputModelClass, ChildClass>(MemberList.Source);

我只需通過(guò)以下方式執(zhí)行更新:


//Fetch entityClassInstance from db:

var entityClassInstance = Context.EntityClasses

.Where(ec => ex.id == id)

.Include(ec => ec.children)

.FirstOrDefault();


//Perform update:

Mapper.Map(inputModelClassInstance, entityClassInstance);

我可以在父子集合中添加和刪除,EF CORE + AutoMapper 將按預(yù)期添加、刪除和更新。


我相信.UseEntityFrameworkCoreModel<MyContext>(serviceProvider)添加了 AutoMapper 將使用 Ids 來(lái)比較要添加、刪除和更新的配置。


重要提示:包含子實(shí)體非常重要,否則 AutoMapper 不會(huì)更新它們。


查看完整回答
反對(duì) 回復(fù) 2022-07-23
  • 3 回答
  • 0 關(guān)注
  • 268 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)