C# ViewModel对象转换为实体框架对象

C# ViewModel对象转换为实体框架对象,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,目标:按实体框架保存ViewModel对象。我有UserViewModel对象,它有UnitViewModel的列表。然后,我有一个UserAdapter类,它将UserViewModel转换为实体框架User对象(请参见下面的Convert()) 现在,我的问题是如何将这个UnitViewModel列表转换为相应的实体框架Unitlist?-我是否必须通过调用类似于Context.Units.Where(u=>myListofUnitIDs.Contains(u.UnitID))的东西从DB上

目标:按实体框架保存ViewModel对象。我有
UserViewModel
对象,它有
UnitViewModel
的列表。然后,我有一个
UserAdapter
类,它将
UserViewModel
转换为实体框架
User
对象(请参见下面的
Convert()

现在,我的问题是如何将这个
UnitViewModel
列表转换为相应的实体框架
Unit
list?-我是否必须通过调用类似于
Context.Units.Where(u=>myListofUnitIDs.Contains(u.UnitID))
的东西从DB上下文获取每个对象

public类UserViewModel
{
公共Guid?用户ID{get;set;}
公共字符串用户名{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串密码{get;set;}
公共日期时间?CreateTime{get;set;}
公共列表用户单元{get;set;}
}
公共类UnitViewModel
{
公共Guid UnitID{get;set;}
公共字符串名称{get;set;}
公共int?SortIndex{get;set;}
公共日期时间CreateTime{get;set;}
公共布尔赋值{get;set;}
}
公共类用户适配器
{
公共静态用户转换(UserViewModel userView)
{
用户;
if(userView.UserID.HasValue)
{
使用(var provider=new CoinsDB.UsersProvider())
{
user=provider.GetUser(userView.UserID.Value);
}
}
其他的
{
user=新用户();
}
user.FirstName=userView.FirstName;
user.LastName=user.LastName;
user.Password=StringHelper.GetSHA1(userView.Password);
user.UserName=user.UserName;
user.CreateTime=DateTime.Now;
//这里的问题:)
//user.Units=userView.UserUnits;
返回用户;
}
}

更新:这里的主要问题是,我必须从数据库中检索每个
单元
,以将其与
ViewModel.Unit
对象匹配(或映射),对吗?我可以避免吗?

请参考,此操作主要称为映射。因此,需要将视图模型对象映射到实体对象

为此,您可以使用现有的第三方库作为。它将通过反射映射具有相同名称的属性。您还可以使用
After
方法添加自定义逻辑。但是,这种方法有一些优点和缺点。了解这些缺点可以帮助您决定是否必须使用此API。因此,我建议您阅读一些关于
AutoMapper
的优缺点的文章,特别是关于将实体转换为其他模型的文章。其中一个缺点是,将来在视图模型中更改一个属性的名称可能会出现问题,
AutoMapper
将不再处理此问题,您也不会收到任何有关此问题的警告

foreach(var item in userView.UserUnits)
{
     // get the mapped instance of UnitViewModel as Unit
     var userUnit = Mapper.Map<UnitViewModel, UserUnit>(item);
     user.Units.Add(userUnit);
}

在这种情况下,AutoMapper可能会变得很方便。如果您不希望出现意外行为,请防止使用任何AutoMapper。。。然后编写普通代码,例如
userView.UserUnits.forEach(p=>user.Units.Add(newunit{…}))
。它看起来很难看,但100%正常工作,然后我必须从数据库中获取每个
单元,对吗?我可以避免这种情况吗?
provider.GetUser()
可以返回用户及其所有单位,然后您可以映射它是的,但用户可以选择一些新的
单位
,这些单位在
user.units
列表中不存在。谢谢您的回答。你也能看一下我的更新吗?另外,我想从
ViewModel.Unit
向后映射它以获取
EF.Unit
。为此,我恐怕必须从数据库中检索每个
EF.Unit
。我可以避免这种数据库检索吗?@levi如果你想更新,那么你需要上下文中的原始单位实体。你想发送基于新视图模型的更新查询吗?@levi如果你不需要它们的原始值,那么你可以创建新的
Unit
对象,只需设置它们的主键属性。是的,确切地说,要点是update
User
及其所有
Units
和courseSo的其他属性,更新发生在
Users
表和
UserUnits
表中。后者仅包含
UserID和UnitID
。我不想更新
Units
表本身,只想更新
UserUnits
foreach(var item in userView.UserUnits)
{
     // get the mapped instance of UnitViewModel as Unit
     var userUnit = Mapper.Map<UnitViewModel, UserUnit>(item);
     user.Units.Add(userUnit);
}
 user.Units = userView.UserUnits
       .Select(userUnitViewModel => userUnitViewModel.MapTo<UserUnit>())
       .ToList();
 public class UserUnitMapper:
        IMapToNew<UnitViewModel, UserUnit>
    {
        public UnitViewModel Map(UserUnit source)
        {
            return new UnitViewModel
            {
                Name = source.Name,
                ...
            };
        }
    }
foreach(var item in userView.UserUnits)
{
     // get the mapped instance of UnitViewModel as Unit
     var userUnit= new UserUnit()
           {
               Name = item.Name,
               ...
           };

     user.Units.Add(userUnit);
}