gpt4 book ai didi

c# - MVC5自定义 View 模型,获取更改,更新数据库

转载 作者:行者123 更新时间:2023-12-03 10:35:29 24 4
gpt4 key购买 nike

我有一个复杂的对象,已分解为一个ViewModel形式。我将说明该结构的一个示例,但来自大约6个不同实体的字段总数约为60个。

// ViewModel

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 };
}
}

所有这些工作正常,我从View进入Controller

// Controller
[HttpPost]
public ActionResult Update(SomeViewModel vm)
{
//TODO: 1. Know which properties in the ViewModel changed for auditing

//TODO: 2. Update all changed EF entities in the database.

}
  • 在将ViewModel发送到View之前,我将原始Value缓存在Session对象中,并使用反射将两者进行比较。它已经绘制好了,我需要做很多工作才能进行任何更改。有没有更好的办法??
  • ViewModel与EF模型的结构不同,因此需要一堆自定义映射来更新正确的实体。由于字段数多,我想避免这种情况。有没有更好的办法?
  • 最佳答案

    好的,不确定这是否是您所需要的,但是对于我的理解是:

  • 您可以像这样获得原始值和当前值:
     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);
    }
    }
  • 若要将ViewModels映射到EF模型,可以使用Automapper,它很容易:
    AutoMapper.Mapper.CreateMap<Book, BookViewModel>();
    var model = AutoMapper.Mapper.Map<BookViewModel>(book);

  • 编辑:
    好的,如果需要手动执行此操作,则可以使用以下方法映射对象:
        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);
    }
    }

    您只需要传递一个目的地对象和一个从中映射属性的源即可。

    关于c# - MVC5自定义 View 模型,获取更改,更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31395548/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com