在年前上班的时候遇到了一个问题是这样描述的:我前台设计一个页面,是标签和文本框,当用户修改了哪个文本框的值,将该修改前的值、修改后的值,该值对应的字段,该值对应的行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. HTML 5 视频(video)

    video 元素支持三种视频格式 IE Firefox Opera Chrome Safari 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件 No 3.5+ 10.5+ 5. ...

  2. Weblogic部署项目三种方式

    在weblogic中部署项目通常有三种方式:第一,在控制台中安装部署:第二,将部署包放在domain域中autodeploy目录下部署:第三,使用域中配置文件config.xml 进行项目的部署. 控 ...

  3. SQL日期相关的操作

    DECLARE @dt datetime SET @dt=GETDATE() DECLARE @number int --1.指定日期该年的第一天或最后一天 --A. 年的第一天 ),)+'1-1' ...

  4. PHP 模拟 HTTP 基本认证(Basic Authentication)

    当某个页面需要认证才能进行访问时,接到请求后服务器端会在响应头中发送一个 WWW-Authenticate 首部(用来标识认证安全域),语法为 WWW-Authenticate:Basic relam ...

  5. PHP用星号隐藏部份用户名、身份证、IP、手机号等实例

    PHP用星号隐藏部份用户名.身份证.IP.手机号等实例 http://www.jb51.net/article/48800.htm 作者: 字体:[增加 减小] 类型:转载 时间:2014-04-08 ...

  6. 掌握Thinkphp3.2.0----视图

    我们将要学习一下 ThinkPHP 视图,视图是 Web 的可见内容,一般是 HTML结合 PHP 获取的数据提供给用户使用的部分,属于 MVC 中的 V 一. 模版定义 默认的模版文件定义规则:视图 ...

  7. ES6 will change the way you write JS code.

    https://hacks.mozilla.org/2015/04/es6-in-depth-an-introduction/ Counting to 6 The previous editions ...

  8. vmware中两台虚拟机互相访问

    hosts文件   简单说,就是本来访问某个机器是通过其ip,在hosts文件中给ip对应一个名字,那么就可以通过名字来替代ip去访问该机器了(名字显然比ip好记) 环境:宿主机win10系统,安装了 ...

  9. Oracle中日期时间的操作比较和加减-入门基础(转)

    Oracle关于时间/日期的操作     1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual ...

  10. How to only capute sub-matched character by grep

    File content: <a href="ceph-0.80.9-82.1.x86_64.rpm"><img src="/icons/rpm.gif ...