MVC5自定义视图模型,获取更改,更新数据库

时间:2015-07-14 00:10:20

标签: c# asp.net-mvc entity-framework mvvm

我有一个复杂的对象,我已经分解为ViewModel表单。我将举例说明一个结构样本,但是从大约6个不同实体混合起来,字段总数约为60个。

// 视图模型

function(e)

所有这一切都正常,我从视图

进入控制器

// 控制器

public class SomeViewModel
{
   public TabOne TabOne {get;set;}
   public TabTwo TabTwo {get;set;}

   public SomeViewModel(ComplexObject co)
   {
      this.TabOne = new TabOne { Name = co.Name, Value = co.Value};
      this.TabTwo = new TabTwo { Name = co.Name, Another = co.Another };
   }
}
  1. 在将ViewModel发送到View之前,我在Session对象中缓存原始值并使用反射来比较这两者。它已被抽出,我将不得不做任何改变的大量工作。还有更好的方法吗?

  2. ViewModel与EF模型的结构不同,因此需要执行一系列自定义映射来更新正确的实体。由于字段的数量,我想避免这种情况。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

好的,不确定这是否是你需要的,但是我理解的是:

  1. 您可以获取原始值和当前值:

     using (var dbCtx = new YourDBEntities())
     {
        var yourEntity = dbCtx.YourEntity.Find(1);
    
        var entry = dbCtx.Entry(yourEntity);
    
        foreach (var propertyName in entry.CurrentValues.PropertyNames )
        {
           Console.WriteLine("Property Name: {0}", propertyName);
    
           var originalVal = entry.OriginalValues[propertyName];
           Console.WriteLine("Original Value: {0}", originalVal);
    
           var currentVal = entry.CurrentValues[propertyName];
           Console.WriteLine("Current Value: {0}", currentVal);
        }
     }
    
  2. 要将ViewModel映射到您的EF模型,您可以使用Automapper,它可以像以下一样简单:

    AutoMapper.Mapper.CreateMap<Book, BookViewModel>();
    var model = AutoMapper.Mapper.Map<BookViewModel>(book);
    
  3. 修改 好的,如果您需要手动完成,可以使用以下方法映射对象:

        public static void MapObjects( object source,  object destiny)
        {
            var modelPropertiesName = new HashSet<string>(source.GetType().GetProperties().Select(x => x.Name));
            var entityProperties = destiny.GetType().GetProperties();
    
            var propertyList = entityProperties.Where(p => modelPropertiesName.Contains(p.Name))
                           .ToList();
    
            foreach (var prop in propertyList)
            {
                var modelProperty = source.GetType().GetProperty(prop.Name);
                var value = modelProperty.GetValue(source);
    
                prop.SetValue(destiny, value, null);
            }
        }
    

    您只需要传递一个命运对象和一个来源,从哪里映射属性。