C#中的MVC模型复制

时间:2017-06-03 15:54:19

标签: c# asp.net-mvc

我需要映射到相应数据表的模型,每次更新模型/表时,我都需要将更改映射到存档表以供历史引用。例如 -

public function dropzone(Request $request)
    {
        $img    = $request->file('file'); //access dropzone files   
    }

因此,每次修改表A时,我都需要向A_History添加一个条目,其中包含新数据或原始数据的精确副本。有没有通用的方法来做到这一点,这样我可以将一个字符串作为模型名称传递给方法或类,并且该方法可以自动循环遍历Model类的所有属性,并将它们映射到另一个类是通过匹配名称添加?

2 个答案:

答案 0 :(得分:0)

下面使用反射,所以要小心性能。如果性能是一个非常重要的方面,那么实际上逐个映射属性可能会更好,但如果您正在查看通用实现,则可以尝试以下代码段。

// object instances
A sourceInstance = new A();
A_History destInstance = new A_History();
MapSourceValuesToDestination(sourceInstance, destInstance);

private void MapSourceValuesToDestination(object sourceObject, object destinationObject)
{
    //get all properties
    PropertyInfo[] sourceProperties = typeof (sourceObject).GetProperties();
    PropertyInfo[] destinationProperties = typeof (destinationObject).GetProperties();

    // foreach in source
    foreach (PropertyInfo property in sourceProperties)
    {
        if (property != null)
        {
            string propertyName = property.Name;
            if (!string.IsNullOrEmpty(propertyName))
            {
                // get destination property matched by name
                PropertyInfo matchingProperty = destinationProperties.FirstOrDefault(x => x.Name.Equals(propertyName, StringComparison.InvariantCultureIgnoreCase));    
                if (matchingProperty != null)
                {
                    // get source value
                    object sourceValue = property.GetValue(sourceInstance);
                    if (sourceValue != null)
                    {
                        // set source value to destination
                        matchingProperty.SetValue(destInstance, sourceValue);
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

如果您的历史模型与保存历史记录的模型具有相同的属性,那么您可以执行类似的操作。

  1. 添加Newtonsoft.Json nuget包并执行。

  2. 添加下面显示的代码。

    A model = new A();
    //.....
    // add data to the model
    var json = JsonConvert.SerializeObject(model);
    A_History historyModel = JsonConvert.DeserializeObject<A_History>(json);
    
  3. 现在,您的历史记录模型将填充与A模型相同的所有属性。