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 ...
随机推荐
- 《bootstrap》实战---作为了解
感觉这句话说的挺有道理,"一些最佳实践不管是语义标记还是移动优先的设计,抑或资源性能优化,都需要额外的时间和精力才能时间".用心做,才会做好.
- JS 点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/ 相册模块,点击弹出图片,并左右滚动幻灯片
1, 点击弹出图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- C# Winform 中如何实现音乐播放和视频播放
C# Winform 中如何实现音乐播放和视频播放 namespace WindowsFormsApplication1 { public partial class Form2 : Form { ...
- java Properties 配置信息类
Properties(配置信息类):主要用于生产配置文件和读取配置文件信息. ----> 是一个集合类 继承HashTable 存值是以键-值的方式. package com.beiwo.io; ...
- JavaScript、全选反选-课堂笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQL日期相关的操作
DECLARE @dt datetime SET @dt=GETDATE() DECLARE @number int --1.指定日期该年的第一天或最后一天 --A. 年的第一天 ),)+'1-1' ...
- 几何服务,cut功能测试
关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...
- 从偶然的机会发现一个mysql特性到wooyun waf绕过题
从偶然的机会发现一个mysql特性到wooyun waf绕过题 MayIKissYou | 2015-06-19 12:00 最近在测试的时候,偶然的机会发现了一个mysql的特性, 为啥是偶然的机会 ...
- vim 命令加解密文件
加密文件 vim file :X (大写X,是加密 ,小写x是保存) 输入密码: 确认密码: 解除密码: vim file :set key= :wq 命令模式下,输入 /word 后回车,即查找w ...
- vim - Removing duplicate lines
http://vim.wikia.com/wiki/Uniq_-_Removing_duplicate_lines :sort u