我有一个复杂的对象,我已经分解为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 };
}
}
在将ViewModel发送到View之前,我在Session对象中缓存原始值并使用反射来比较这两者。它已被抽出,我将不得不做任何改变的大量工作。还有更好的方法吗?
ViewModel与EF模型的结构不同,因此需要执行一系列自定义映射来更新正确的实体。由于字段的数量,我想避免这种情况。有更好的方法吗?
答案 0 :(得分: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);
}
}
要将ViewModel映射到您的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);
}
}
您只需要传递一个命运对象和一个来源,从哪里映射属性。