在年前上班的时候遇到了一个问题是这样描述的:我前台设计一个页面,是标签和文本框,当用户修改了哪个文本框的值,将该修改前的值、修改后的值,该值对应的字段,该值对应的行id获取到保存到数据库的某张表里。现在数据库有一张表,结构如下:

修改记录表
ID   修改行ID 修改列名称 修改前的值 修改后的值 所属修改批次 修改时间
1   1 test 10 11 2013-10-11 第一批次 2013-10-11

思路:

1、将数据封装成实体对象传到后台。整套下来是用MVC的机制实现的

2、利用反射。获取对象的字段名称、修改前的值、修改后的值

3、调用保存方法。将修改记录保存到数据库。

4、下面贴上主要实现代码,里面包含设计实现思路:

             //判断字段是否修改(原值、旧值做比较),student为前台传入的数据对象
var oldModel = this.db.Students.Where(p => p.ID == student.ID).FirstOrDefault();
if (oldModel == null)
{
return "返回数据为空!";
} //获取当前对象的属性数组
PropertyInfo[] currentPro = student.GetType().GetProperties();
//获取原始对象的属性数组
PropertyInfo[] oldPro = oldModel.GetType().GetProperties();
foreach (PropertyInfo old in oldPro)
{
foreach (PropertyInfo curtrent in currentPro.
Where(p => !string.IsNullOrEmpty(p.Name))
{
//获取当前数据
object currentColumnValue = curtrent.GetValue(student, null);
//获取原始数据
object oldColumnValue = old.GetValue(oldModel, null); //判断值是否相等
if (currentColumnValue.ToString() != oldColumnValue.ToString())
{
//保存新值/旧值到数据库
SaveStudentLog(oldModel.ID, oldColumnValue.ToString(), currentColumnValue.ToString(), old.Name);
break;
}
}
}

通过反射获取对象包含的字段名称和值

  private void SaveStudentLog(int id, string oldValue, string currentValue, string column)
{
StudentLog studentLog = new StudentLog();
var student = this.db.Students.Where(p => p.ID == id).FirstOrDefault();
if (student == null)
{
return;
} studentLog.Student = student;
studentLog.ValueOfOld = oldValue.Trim();
studentLog.ValueOfNew = currentValue.Trim();
studentLog.FieldName = column;
studentLog.FieldDesc = "";
studentLog.UserAccount = "";
studentLog.UserRoleName = "";
studentLog.UserTrueName = "";
studentLog.UpdateDesc = "";
studentLog.UpdateTime = DateTime.Now;
studentLog.UpdateTimeTag = DateTime.Now.Hour.ToString() +
DateTime.Now.Minute.ToString() +
DateTime.Now.Second.ToString() +
DateTime.Now.Millisecond.ToString();
this.db.StudentLogs.AddObject(studentLog);
this.db.SaveChanges();
}

保存记录到数据库

这样下来,通过调用一个保存编辑函数SaveStudentLog(行ID,修改前的值,修改后的值,列名)即可将修改的值信息保存到记录表里。

C#获取EF实体对象或自定义属性类的字段名称和值的更多相关文章

  1. c# 反射得到实体类的字段名称和值,DataTable转List<T>

    /// <summary> /// 反射得到实体类的字段名称和值 /// var dict = GetProperties(model); /// </summary> /// ...

  2. 使用C#的反射机制读取类的字段名称及值

    using System.Windows.Forms;using System.Reflection; foreach (FieldInfo fi in typeof(SystemInformatio ...

  3. Java8通过Function获取字段名(获取实体类的字段名称)

    看似很鸡肋其实在某些特殊场景还是比较有用的.比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个map的key和value.方法一:声明 String key1="name& ...

  4. 在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”

    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be ...

  5. MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致

    MyBatis系列二  之   数据库列名于程序实体类中字段名称不一致 情景:当数据库中的列名与我们程序实体类中的字段名称不一致         使用ResultMap节点配置信息  在映射文件中  ...

  6. EF实体对象解耦 - 泛型联表查询

    为了达到模块间最小耦合,单模块业务数据不与其他模块发生关系.在操作数据库的时候,采用EF泛型操作.但泛型操作不好实现联表,经过一晚的试验发现了一种定义数据库上下文并联表的方式. 1.实体对象定义.实体 ...

  7. 在EntityFrameworkCore中记录EF修改日志,保存,修改字段的原始值,当前值,表名等信息

    突发奇想,想把业务修改的所有字段原始值和修改后的值,做一个记录,然后发现使用EF可以非常简单的实现这个功能 覆盖父类中的 SaveShanges() 方法 public new int SaveCha ...

  8. event chrome firefox 获取点击对象的 id 类

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  9. C#通过反射获取对象属性,打印所有字段属性的值

    获取所有字段的值: public void PrintProperties(Object obj) { Type type = obj.GetType(); foreach( PropertyInfo ...

随机推荐

  1. ffmpeg(2.6) rockplayer android 下编译 小记.

    最近因为一些需求,开始学习 ffmgeg 在android 上使用. 使用的环境: 1,VMware V8 虚似机 安装的 FedoraV18 系统.(下载地址,请baidu),虚似机,最好有20-3 ...

  2. 经典.net面试题目

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private :   私有成员, 在类的内部才可以访问. protected : 保 ...

  3. 错误信息:attempt to create saveOrUpdate event with null entity

    错误信息:attempt to create saveOrUpdate event with null entity; 这个错误网上答案比较多,我也不多说了. 我遇到的问题是在前台传过来的参数是nul ...

  4. jQuery插件开发(转)

    jQuery插件开发全解析 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命 ...

  5. MySQL优化性能my.cnf详解

    提供一个MySQL 5.6版本适合在1GB内存VPS上的my.cnf配置文件(点击这里下载文件): [client] port=3306 socket=/tmp/mysql.sock [mysqld] ...

  6. OLAP在大数据时代的挑战

    转行做数据相关的工作有近两年时间,除了具体技术,还有许多其它思考. 数据的价值 在涉及具体的技术前,先想一想为什么需要OLAP这样的系统,它有什么价值或者说在公司或部门这是不可取代的么? 可以带来哪些 ...

  7. swift-UserDefaults控制账号和密码

    import UIKit class FiveVC: UIViewController { //MARK:-------- 全局 常量 设置 let IsFirstLaunch = "IsF ...

  8. 阿里云服务器Linux CentOS安装配置(零)目录

    阿里云服务器Linux CentOS安装配置(零)目录 阿里云服务器Linux CentOS安装配置(一)购买阿里云服务器 阿里云服务器Linux CentOS安装配置(二)yum安装svn 阿里云服 ...

  9. JBoss QuickStart之Helloworld

    下载Jboss, quickstart, 按照quickstart说明, mvn clean install. 由于ssl handshake问题(应该是网络连接不稳定), 写了一个脚本不停地尝试bu ...

  10. 【运维工具】Git代码发布系统

    引言 代码发布系统是互联网公司必备的运维系统,作用主要用户发布业务代码 到 业务服务器 为什么需要代码发布系统 有的同学可能说,我们公司服务器就那么一台,做个发布系统太麻烦了? 不认同这说法 发布系统 ...