变更记录,是通过变更前是实体和变更后的实体进行比较后,如有变更记录,就记录到变更表里面。
1、序列化实体:
1)需要在.net framework 4.0:右击MODel层选择属性。
2)添加引用:
3)实体类代码设置:
注意: [Display(Name = “人员ID”)]是为了记录变更字段的中文名称。
2,核心代码两个实体进行比较,用泛型实体记录变更的每个字段,然后保存到变更表。:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.DataAnnotations;
namespace Tlw.zjxypj.Common
{
public static class ChangeRecordUnity
{
/// <summary>
/// 获取修改后的model,获取现在的model,对比model,获得差异
/// </summary>
/// <param name="modelAfter"></param>
/// <param name="modelBefore"></param>
/// <remarks>比对必须是相同的实体类</remarks>
public static List<ChangeInfo> getChanges(object modelAfter, object modelBefore)
{
List<ChangeInfo> lisChangeInfos = new List<ChangeInfo>();
Type t = modelAfter.GetType();
PropertyInfo[] pInfoArr = t.GetProperties();
//Dictionary<string, string> dicChangeList = new Dictionary<string, string>();
foreach (PropertyInfo pi in pInfoArr) //遍历值
{
object objAfter = pi.GetValue(modelAfter, null);//修改后值
object objBefore = pi.GetValue(modelBefore, null);//修改前值
string pValueAfter = objAfter != null ? objAfter.ToString().Trim() : "";//修改后值
string pValueBefore = objBefore != null ? objBefore.ToString().Trim() : "";//修改前值
if (pValueAfter != pValueBefore) //比对
{
//获取修改信息
string aliasName = "";
object[] pAttribute = pi.GetCustomAttributes(typeof(DisplayAttribute), false);
if (pAttribute.Count() > 0)
{
aliasName = ((DisplayAttribute)pAttribute[0]).Name;
}
//dicChangeList.Add(pi.Name,string.Format("{0} 从'{1}'更改为'{2}'",string.IsNullOrEmpty(aliasName)?pi.Name:aliasName,pValueBefore,pValueAfter));
ChangeInfo pChangeInfo = new ChangeInfo();
pChangeInfo.ColumnName = pi.Name;
pChangeInfo.ColumnAliasName = string.IsNullOrEmpty(aliasName) ? pi.Name : aliasName;//变更小类:具体字段的中文名称
pChangeInfo.AfterValue = pValueAfter;
pChangeInfo.BeforeValue = pValueBefore;
lisChangeInfos.Add(pChangeInfo);
}
}
//return dicChangeList;
return lisChangeInfos;
}
}
/// <summary>
/// 变更信息
/// </summary>
public class ChangeInfo
{
/// <summary>
/// 变更字段
/// </summary>
//
//变更小类:具体字段名称
public string ColumnName { get; set; }
//变更小类:具体字段的中文名称
public string ColumnAliasName { get; set; }
//变更后
public string AfterValue { get; set; }
//变更前
public string BeforeValue { get; set; }
}
}
3、调用:
//获取详细改变信息
List<ChangeInfo> lisChangeInfos = ChangeRecordUnity.getChanges(model, modelBefore);
if (lisChangeInfos.Count > 0)
{
for (int i = 0; i < lisChangeInfos.Count; i++)
{
zjbaksys.Model.CHANGELOG pModel = new zjbaksys.Model.CHANGELOG();
pModel.ID = DbHelperOra.GetSEQ("SEQ_CHANGELOG");
pModel.APPCHECKID = decimal.Parse(pCheckid);
pModel.ENTERPRISEID = ENTERPRISEID;
pModel.TYPE = "技术负责人信息";
pModel.SUBTYPE = lisChangeInfos[i].ColumnName;
pModel.SUBALIASNAME = lisChangeInfos[i].ColumnAliasName;
pModel.AFTERVALUE = lisChangeInfos[i].AfterValue;
pModel.BEFOREVALUE = lisChangeInfos[i].BeforeValue;
pModel.OPERATION = "修改";
pModel.UNIQUENAME = modelBefore.PERSONNAME.Trim();
pModel.SUBMITTIME = System.DateTime.Now;
listLog.Add(pModel);
}
}
4、变更记录表: