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 ...
随机推荐
- C# 线程调用主线程中的控件
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...
- hud 5876 2016 ACM/ICPC Asia Regional Dalian Online
题意:给一个图 给定一个点s 求补图中s点到达各个点的最短路 思路:从s点开始bfs 在图中与s点有连接的都是在补图中不能直接到达的点 反之在补图中都是可以直接到达的点 由此bfs ((( 诡异的写法 ...
- 微信分享JS函数(原创)[已失效]
//微信内置浏览器分享事件 //来自:http://www.cnblogs.com/cielwater //分享朋友圈事件 //UpdateWeixinJSBridge(CircleModel[Jso ...
- cout中的执行顺序_a++和++a
printf和cout从右到左计算: int main() { /* char* str = NULL; setmemory(&str, 100); strcpy(str, "hel ...
- Meteor 学习
官方网站 https://www.meteor.com/ 官方API手册 https://guide.meteor.com/ http://docs.meteor.com/ 中文网站 http://c ...
- 分析-eclipse已经导入jar包了,但还是出现classNotFound异常
场景:分析-eclipse已经导入jar包了,但还是出现classNotFound异常 分析--eclipse已经导入jar包了,但还是出现classNotFound错误 最近在做一个web项目时,由 ...
- Mysql中字段类型不一致导致索引无效
修改后 详细见楼下链接 http://ustb80.blog.51cto.com/6139482/1287847
- 在将 varchar 值 '' 转换成数据类型 int 时失败
我们有时候用in语句的时候,发现存在Sql注入漏洞,想参数化处理一下,遇到语句执行问题!! declare @ids varchar() set @ids='216,218' select * fro ...
- Kafka 解析
Kafak采用硬盘顺序写入和内存映射文件技术提示性能.即便是顺序写入硬盘,硬盘的访问速度还是不可能追上内存.所以Kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内存提高I/ ...
- .NET中MemCached使用介绍
阅读目录 1.MemCached是什么? 2.Window中MemCached安装 3.MemCached命令 4.简单示例 MemCached是什么 MemCached是一个自由开源,高性能,分布式 ...