小编Ron*_*gan的帖子

Automapper创建新实例而不是地图属性

这是一个漫长的过程.

所以,我有一个模型和一个viewmodel,我正在从AJAX请求更新.Web API控制器接收viewmodel,然后我使用AutoMapper更新现有模型,如下所示:

private User updateUser(UserViewModel entityVm)
{
    User existingEntity = db.Users.Find(entityVm.Id);
    db.Entry(existingEntity).Collection(x => x.UserPreferences).Load();

    Mapper.Map<UserViewModel, User>(entityVm, existingEntity);
    db.Entry(existingEntity).State = EntityState.Modified;

    try
    {
        db.SaveChanges();
    }
    catch
    { 
        throw new DbUpdateException(); 
    }

    return existingEntity;
}
Run Code Online (Sandbox Code Playgroud)

我为User - > UserViewModel(和back)映射配置了自动配置.

Mapper.CreateMap<User, UserViewModel>().ReverseMap();
Run Code Online (Sandbox Code Playgroud)

(注意,显式设置相反的地图并省略ReverseMap表现出相同的行为)

我遇到的Model/ViewModel成员是一个不同对象的ICollection问题:

[DataContract]
public class UserViewModel
{
    ...
    [DataMember]
    public virtual ICollection<UserPreferenceViewModel> UserPreferences { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

相应的模型是这样的:

public class User
{
    ...
    public virtual ICollection<UserPreference> UserPreferences { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题:

除了ICollections上面显示的UserPreferences/UserPreferenceViewModels 之外,User和UserViewModel类的每个属性都正确映射.当这些集合从ViewModel映射到Model而不是map属性时,将从ViewModel创建UserPreference对象的新实例,而不是使用ViewModel属性更新现有对象.

模型:

public …
Run Code Online (Sandbox Code Playgroud)

c# mapping automapper

13
推荐指数
2
解决办法
1万
查看次数

在现有代码上创建异步WebApi包装器

我们使用WebAPI公开当前的逻辑/业务层.根据我的理解,如果我们想要保护我们的自我免受线程饥饿的请求,我们应该制作Async WebAPI控制器,这样就可以弥补大量的并发请求.

我明白,由于底层服务/业务层是同步的,因此不会有性能提升.我们的目标是大量并发请求通过.

以下是我正在使用的代码:

public async Task<IHttpActionResult> Get()
{
     var result = await Task.Run(() => Service.GetAllCompanies()); //existing business layer
     return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)

在任务中包装底层图层是很好的继续并实现目标.

iis asynchronous task-parallel-library asp.net-web-api asp.net-web-api2

1
推荐指数
1
解决办法
84
查看次数