正确映射视图模型到实体
我有我的实体:正确映射视图模型到实体
public class User {
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
我有我的UserViewModel作为
public class UserViewModel {
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
我使用这些如下在我的控制器:
//This is called from my view via ajax public void Save(UserViewModel uv)
{
// this throws error: cannot convert from UserViewModel to Entity.User
MyRepository.UpdateUser(uv);
}
我在库中的UpdateUser如下:
public void UpdateUser(User u) {
var user = GetUserDetails(u.Id);
user.Name = u.Name;
user.Address = u.Address;
//using entity framework to save
_context.SaveChanges();
}
我该如何正确在我的控制器映射UserViewModel到我的仓库内实体
回答:
通过使用AutoMapper你可以这样做:
public void Save(UserViewModel uv) {
// this throws error: cannot convert from UserViewModel to Entity.User
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<UserViewModel , User>();
});
User u = config.CreateMapper().Map<User>(uv);
MyRepository.UpdateUser(u);
}
或手动:
public void Save(UserViewModel uv) {
User u = new User()
{
Id = uv.Id
Name = uv.Name;
Address = uv.Address;
};
MyRepository.UpdateUser(u);
}
如果您更改视图模型和模型,那么手动执行操作并不好,那么您也应该更改代码,但使用Automapper
您不需要编辑更改代码。
EDIT1:
这是使用模型 - 视图存储库(数据访问核心)不是好主意,所以这将是更好地保持你的public void UpdateUser(User u)
,不改变它,在外面,最好是通过user
到UpdateUser
不是UserViewModel
就像你之前做过的一样。
EDIT2:
在我回答的帖子的看法非不相关的SOC(在关注点分离),即使我的...
1 - 当我通过UserViewModel
我已经触犯了SOC ....
2-在另一方,如果我直接在Peresentation层获得用户,我也违反了SOC。
我认为最好的办法是中间层代理....
介绍< ---->代理< ---->库。
回答:
你正在做的属性值的映射(视图模型 - > enity模型)UpdateUser
方法。因此,使用视图模型类(UserViewModel
)作为其参数类型。
public void UpdateUser(UserViewModel u) {
// Get the entity first
var user = GetUserDetails(u.Id);
// Read the property values of view model object and assign to entity object
user.Name = u.Name;
user.Address = u.Address;
//using entity framework to save
_context.SaveChanges();
}
现在从您的Save
方法,您可以将视图模型对象传递给此方法。
这将修复您的编译时错误(,这是您在问题中的当前问题),但要注意您在哪些图层中使用了哪些类。如果您太担心在数据访问层中使用视图模型类,则可以在中间服务层中执行此操作。但是,您将获得该层中的实体模型并在那里进行更新。
请记住,对于该问题没有明确的答案。 使用您认为可读且与项目/团队保持一致的方法。很多时候,我倾向于使用术语“普通DTO类”而不是“查看模型”,所以我可以平静地将这些术语转移到另一层。我将它们放在一个单独的项目中(称为Common DTO),这将跨越其他项目。这意味着我将在Web/UI层和数据访问/服务层中添加对此Common DTO项目的引用,并根据需要使用这些参考。
回答:
您的存储库处理User
类型的对象,因此您需要将值映射回该类型的实例,然后进行调用。
假设你有一个方法来获得所谓的GetUser
用户:
public void Save(UserViewModel uv) {
var user = MyRepository.GetUser(uv.Id);
user.Name = uv.Name;
user.Address = uv.Address;
MyRepository.UpdateUser(user);
}
然后,您可以保存在你的仓库类变化。您可以将对象,以确保有,如果对象是在不同的环境中创建的任何问题:
public void UpdateUser(User u) {
_context.Users.Attach(u);
_context.Entry(u).State = EntityState.Modified;
_context.SaveChanges();
}
以上是 正确映射视图模型到实体 的全部内容, 来源链接: utcz.com/qa/265777.html