介绍在使用EF更新数据库实体时。很多时候我们想要的只是更新表中的某一个或部分字段。虽然可以通过设置来告诉上下文我们要更新的字段。但是一般我们都会把数据持久层封装起来。通过泛型操作。而这时我们就无法得知应用层面修改了哪些字段了。
小编给大家分享一下c#中实现监控类属性更改的代码案例分享,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
c#监控类属性的更改(大花猫动了哪些小玩具)
在使用EF更新数据库实体时。很多时候我们想要的只是更新表中的某一个或部分字段。虽然可以通过设置来告诉上下文我们要更新的字段。但是一般我们都会把数据持久层封装起来。通过泛型操作。而这时我们就无法得知应用层面修改了哪些字段了。
1///& lt; summary> 2///一个具体的实体 3///& lt;/summary> 4公共类AccountEntity: MainEntity 5 { 6///& lt; summary> 7///文本类型 8///& lt;/summary> 9公共虚拟字符串账户{得到;设置;} 10///& lt; summary> 11///又一个文本属性 12个///& lt;/summary> 13个公共虚拟字符串密码{得到;设置;} 14///& lt; summary> 15///数字类型 16///& lt;/summary> 17个公共虚拟int性{得到;设置;} 18///& lt; summary> 19///事件类型 20///& lt;/summary> 21日公共虚拟DateTime生日{得到;设置;} 22///& lt; summary> 23///双精度浮点数 24///& lt;/summary> 25公共虚拟双高度{得到;设置;}///26日& lt; summary>///27日十进制数 28///& lt;/summary> 29日公共虚拟十进制因{得到;设置;} 30///& lt; summary> 31日///二进制 32///& lt;/summary> 33公共虚拟byte [] PublicKey{得到;设置;} 34///& lt; summary> 35///Guid类型 36个///& lt;/summary> 37公共虚拟Guid AreaId{得到;设置;} 38}
=new accountEntity var实体(); entity.Id=1; 实体。账户=案粜愿持? # 39;;
db.Update(实体);
db.Update(实体,“Account");
保护Dictionary<字符串,dynamic>FieldTracking=new Dictionary<字符串,dynamic> ();
FieldTracking [“Account"]=案粜愿持怠?
公共账户 { 得到 {返回_Account;} 集{ _Account=价值; FieldTracking [“Account"]=价值; } }
//获取实体所在的程序集(ClassLibraryDemo) var assemblyArray=AppDomain.CurrentDomain.GetAssemblies () 其中(w=比;w.GetName ()。名字==癈lassLibraryDemo") .ToList ();//实体的基类 var baseEntityType=typeof (BaseEntity);//循环程序集 foreach (assemblyArray组装项目) {//找到这个程序集中继承自基类的实体 var=item.GetTypes类型()。在哪里(t=比;t。IsAbstract==假 ,,baseEntityType.IsAssignableFrom (t) ,,t !=baseEntityType); foreach(类型btItem类型){//遍历这个实体类中的属性=btItem.GetProperties (BindingFlags var属性。公共| BindingFlags.Instance) 其中(w=比;w。CanRead,,w.CanWrite ,,w.GetCustomAttributes (typeof (NoMapAttribute),假).Any ()==false//TODO:要不要检查得到方法? ,,w.GetSetMethod () .IsVirtual); } }
//首先创建一个与实体类对应的动态类 CodeTypeDeclaration ct=new CodeTypeDeclaration (btItem。名称+“_Dynamic");//循环实体中的所有标记为虚拟的属性 foreach (PropertyInfo fiItem属性) {//创建一个属性 var p=新CodeMemberProperty ();//设置属性为公共,重写 p。=MemberAttributes属性。公共| MemberAttributes.Override;//覆盖//设置属性的类型为继承的属性的数据类型 p。类型=new CodeTypeReference (fiItem.PropertyType);//属性名称与继承的一致 p。=fiItem.Name名称;//包含组代码 p。HasSet=true;//包含得到代码 p。HasGet=true;//设置有代码//返回base.Account p.GetStatements。添加(新CodeMethodReturnStatement ( 新CodeFieldReferenceExpression ( 新的CodeBaseReferenceExpression (), fiItem.Name)));//设置组代码//base.Account=价值; p.SetStatements.Add ( 新CodeAssignStatement ( 新CodeFieldReferenceExpression ( 新的CodeBaseReferenceExpression (), fiItem.Name), 新CodePropertySetValueReferenceExpression ()));//FieldTracking [“Account"]=价值; p.SetStatements。添加(新CodeSnippetExpression (“FieldTracking [\”;“+ fiItem。名称+“\“]=value"));//将属性添加到类中 ct.Members.Add (p); }c#中实现监控类属性更改的代码案例分享