C#获取EF实体对象或自定义属性类的字段名称和值
在年前上班的时候遇到了一个问题是这样描述的:我前台设计一个页面,是标签和文本框,当用户修改了哪个文本框的值,将该修改前的值、修改后的值,该值对应的字段,该值对应的行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实体对象或自定义属性类的字段名称和值的更多相关文章
- c# 反射得到实体类的字段名称和值,DataTable转List<T>
/// <summary> /// 反射得到实体类的字段名称和值 /// var dict = GetProperties(model); /// </summary> /// ...
- 使用C#的反射机制读取类的字段名称及值
using System.Windows.Forms;using System.Reflection; foreach (FieldInfo fi in typeof(SystemInformatio ...
- Java8通过Function获取字段名(获取实体类的字段名称)
看似很鸡肋其实在某些特殊场景还是比较有用的.比如你将实体类转Map或者拿到一个Map结果的时候,你是怎么获取某个map的key和value.方法一:声明 String key1="name& ...
- 在实体对象中访问导航属性里的属性值出现异常“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 ...
- MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致
MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致 情景:当数据库中的列名与我们程序实体类中的字段名称不一致 使用ResultMap节点配置信息 在映射文件中 ...
- EF实体对象解耦 - 泛型联表查询
为了达到模块间最小耦合,单模块业务数据不与其他模块发生关系.在操作数据库的时候,采用EF泛型操作.但泛型操作不好实现联表,经过一晚的试验发现了一种定义数据库上下文并联表的方式. 1.实体对象定义.实体 ...
- 在EntityFrameworkCore中记录EF修改日志,保存,修改字段的原始值,当前值,表名等信息
突发奇想,想把业务修改的所有字段原始值和修改后的值,做一个记录,然后发现使用EF可以非常简单的实现这个功能 覆盖父类中的 SaveShanges() 方法 public new int SaveCha ...
- event chrome firefox 获取点击对象的 id 类
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- C#通过反射获取对象属性,打印所有字段属性的值
获取所有字段的值: public void PrintProperties(Object obj) { Type type = obj.GetType(); foreach( PropertyInfo ...
随机推荐
- HTML 5 视频(video)
video 元素支持三种视频格式 IE Firefox Opera Chrome Safari 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件 No 3.5+ 10.5+ 5. ...
- Weblogic部署项目三种方式
在weblogic中部署项目通常有三种方式:第一,在控制台中安装部署:第二,将部署包放在domain域中autodeploy目录下部署:第三,使用域中配置文件config.xml 进行项目的部署. 控 ...
- SQL日期相关的操作
DECLARE @dt datetime SET @dt=GETDATE() DECLARE @number int --1.指定日期该年的第一天或最后一天 --A. 年的第一天 ),)+'1-1' ...
- PHP 模拟 HTTP 基本认证(Basic Authentication)
当某个页面需要认证才能进行访问时,接到请求后服务器端会在响应头中发送一个 WWW-Authenticate 首部(用来标识认证安全域),语法为 WWW-Authenticate:Basic relam ...
- PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
PHP用星号隐藏部份用户名.身份证.IP.手机号等实例 http://www.jb51.net/article/48800.htm 作者: 字体:[增加 减小] 类型:转载 时间:2014-04-08 ...
- 掌握Thinkphp3.2.0----视图
我们将要学习一下 ThinkPHP 视图,视图是 Web 的可见内容,一般是 HTML结合 PHP 获取的数据提供给用户使用的部分,属于 MVC 中的 V 一. 模版定义 默认的模版文件定义规则:视图 ...
- 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 ...
- vmware中两台虚拟机互相访问
hosts文件 简单说,就是本来访问某个机器是通过其ip,在hosts文件中给ip对应一个名字,那么就可以通过名字来替代ip去访问该机器了(名字显然比ip好记) 环境:宿主机win10系统,安装了 ...
- Oracle中日期时间的操作比较和加减-入门基础(转)
Oracle关于时间/日期的操作 1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual ...
- 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 ...