3 回答

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);

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)題。

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ì)更新它們。
- 3 回答
- 0 關(guān)注
- 268 瀏覽
添加回答
舉報(bào)