这是一个漫长的过程.
所以,我有一个模型和一个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) 我们使用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