ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:20.25KB ,
资源ID:3517362      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3517362.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(net基础篇entity framework 数据转换层通用类.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

net基础篇entity framework 数据转换层通用类.docx

1、net基础篇entity framework 数据转换层通用类NET基础篇Entity Framework 数据转换层通用类 2012CSDN博客之星火热出炉! 2013年全国百所高校巡讲讲师招募 .NET基础篇Entity Framework 数据转换层通用类 分类: Entity Framework 2012-08-27 09:38 221人阅读 评论(0) 收藏 举报 在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码。为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity Framework时常用

2、到的通用类。首先在数据库建立起几个关联表:Person、Company、Position,三个实体之间通过导航属性进行相互引用。下面为大家分别介绍以泛型实现的 Create、Read、Update、Delete 操作:1. Create在ObjectContext类之中,早已经为大家预定了一个Create 的操作 AddObject:void ObjectContext.AddObject(entitySetName string,object entity)void ObjectSet<T>.AddObject(T entity) 1 public int Add<T>

3、;(T entity) where T : EntityObject 2 3 int changedCount = 0; 4 try 5 6 using (BasicArchitectureEntities context = new BasicArchitectureEntities() 7 8 context.AddObject(typeof(T).Name, entity); 9 changedCount = context.SaveChanges();10 if (changedCount > 0)11 context.AcceptAllChanges();12 13 14 ca

4、tch (Exception ex)15 . 16 return changedCount;17 从下面的测试可以看到,ObjectContext.AddObject(entitySetName string,object entity)已相当成熟,它不但可以加入单个实体,也可通过导航属性,一次性加入多个关联实体。 1 static void Main(string args) 2 3 BaseCommand command = new BaseCommand(); 4 /建立关联实体 5 Company company = new Company() CompanyName = Sun 6

5、,Address=Beijing,Telephone=010-87654321; 7 Position position = new Position() PositionName = Project Manager 8 , Salary = 15000.00, Company = company ; 9 /通过Add<T>同时加入实体对象company与position10 int n=command.Add<Position>(position);11 12 Console.ReadKey();13 若要使用批量插入,只要在AddObject方法前多加一个重复语言即

6、可,在此就不再多作解释了。 1 public int AddList<T>(List<T> entityList) where T : EntityObject 2 3 int changedCount = 0; 4 try 5 6 using (BasicArchitectureEntities context = new BasicArchitectureEntities() 7 8 foreach (T entity in entityList) 9 context.AddObject(typeof(T).Name, entity);10 changedCount

7、 = context.SaveChanges();11 if (changedCount > 0)12 context.AcceptAllChanges();13 14 15 catch (Exception ex)16 . 17 return changedCount;18 2. Delete同样地,ObjectContext 类当中也存在方法 ObjectContext.DeleteObject(object entity)用于删除实体。首先通过输入的参数 id 建立起EntityKey对象,然后在ObjectContext查找此实体,若实体存在则使用ObjectContext.De

8、leteObject(object entity)方法把此实体删除 。 1 public int Delete<T>(int id) where T : EntityObject 2 3 int changedCount = 0; 4 try 5 6 using (BasicArchitectureEntities context = new BasicArchitectureEntities() 7 8 /建立EntityKey对象 9 EntityKey entityKey = new EntityKey(10 BasicArchitectureEntities. + type

9、of(T).Name, Id, id);11 /通过EntityKey找到实体12 var objResult = context.GetObjectByKey(entityKey);13 /若实体存在则删除实体14 if (objResult != null)15 context.DeleteObject(objResult);16 changedCount = context.SaveChanges();17 if (changedCount > 0)18 context.AcceptAllChanges();19 20 21 catch (Exception ex)22 . 23

10、return changedCount;24 ObjectContext.DeleteObject(object entity)与ObjectContext.AddObject(entitySetName string,object entity)相同,可以通过导航属性,一次性删除多个关联实体。但如果数据库中存在下面的数据Company表:Position表: 此时使用此 int Delete<Company>(2) 方法删除Company对象,系统将会报错。这是由于导航属性在默认情况下具有延时加载的特性,在系统使用ObjectContext.GetObjectByKey(enti

11、tyKey)方法加载实体时,它的导航属性不会马上加载到上下文当中。而是在调用该导航属性时,对象才会被加载。因而系统通过ObjectContext.GetObjectByKey(2)获取Company对象时,对应的Position对象并未被加载到上下文当中,所以当删除Company对象时,Position对象不能被同步删除,因而造成逻辑上的错误。为解决这一问题,可以利用RelatedEnd.Load()方法提前加载导航属性。RelatedEnd是EntityCollection<TEntity> 、EntityReference的父类,它们是特定实体类型的对象集合,该实体类型表示一对

12、多、多对一、多对多的关系。而RelatedEnd.Load()方法,可以将一个或多个相关对象提前加载到相关实体当中。首先通过ObjectContext.GetObjectByKey(entityKey)方法找到Company对象,然后利用反射属性PropertyInfo类获取导航属性Position,最后使用RelatedEnd.Load()方法,把导航属性加载到当前上下文中。此时使用Delete<Company,Position>(2)方法删除Company对象时,系统将能正常运行,并把对应的Position对象一并删除。 1 public int Delete<PKEnt

13、ity, FKEntity>(int id) 2 where PKEntity : EntityObject 3 where FKEntity : EntityObject 4 5 int changedCount = 0; 6 try 7 8 using (BasicArchitectureEntities context = new BasicArchitectureEntities() 9 10 /根据软件Id建立EntityKey对象11 EntityKey entityKey = new EntityKey(12 BasicArchitectureEntities. + typ

14、eof(PKEntity).Name, Id, id);13 /根据EntityKey查找对应对象14 PKEntity objResult = context.GetObjectByKey(entityKey) as PKEntity;15 /根据FKEntity加载导航属性16 PropertyInfo propertyInfo = typeof(PKEntity).GetProperty(17 typeof(FKEntity).Name);18 EntityCollection<FKEntity> FKEntityList = propertyInfo.GetValue(19

15、 objResult, null) as EntityCollection<FKEntity>20 21 if (FKEntityList != null)22 FKEntityList.Load();23 24 if (objResult != null)25 context.DeleteObject(objResult);26 changedCount = context.SaveChanges();27 28 if (changedCount > 0)29 context.AcceptAllChanges();30 31 32 catch (Exception ex)3

16、3 . 34 return changedCount;35 通过下面的方法也可根据输入的委托predicate,批量删除有关的数据。 1 public int Delete<T>(Func<T,bool> predicate) where T: EntityObject 2 3 int changedCount = 0; 4 try 5 6 using (BasicArchitectureEntities context = new BasicArchitectureEntities() 7 8 /根据输入的委托查找数据 9 var list = context.Cre

17、ateObjectSet<T>().Where(predicate);10 /若存在数据,删除有关数据11 if (list.Count() > 0)12 foreach (var obj in list)13 context.DeleteObject(obj);14 15 changedCount = context.SaveChanges();16 if (changedCount > 0)17 context.AcceptAllChanges();18 19 20 catch (Exception ex)21 . 22 return changedCount;23

18、 与前面的例子相同,当使用 Delete<Company>(x=>x.Id=2) 方法删除 Company 对象时,由于导航属性 Position 处于延迟加载的状态,以致系统无法实现同步删除,从而令数据出现逻辑性的错误。此时使用类似的方法,利用 RelatedEnd.Load() 把导航属性提前加入到上下文中,再删除Company对象时,系统就可以把对应 Position 对象一并删除。 1 public int Delete<PKEntity, FKEntity>(Func<PKEntity,bool> predicate) 2 where PKE

19、ntity : EntityObject 3 where FKEntity : EntityObject 4 5 int changedCount = 0; 6 try 7 8 using (BasicArchitectureEntities context = new BasicArchitectureEntities() 9 10 /根据输入的委托查找数据11 var list = context.CreateObjectSet<PKEntity>().Where(predicate);12 /若数目大于0,删除有关数据13 if (list.Count() > 0)14

20、 15 foreach (var obj in list)16 17 /在删除前加载其导航属性18 PropertyInfo propertyInfo = typeof(PKEntity)19 .GetProperty(typeof(FKEntity).Name);20 EntityCollection<FKEntity> FKEntityList = propertyInfo21 .GetValue(obj, null) as EntityCollection<FKEntity>22 if (FKEntityList.Count > 0)23 FKEntityL

21、ist.Load();24 25 context.DeleteObject(obj);26 27 28 changedCount = context.SaveChanges();29 30 if (changedCount > 0)31 context.AcceptAllChanges();32 33 34 catch (Exception ex)35 . 36 return changedCount;37 此时使用Delete<Company,Position>(x=>x.Id=2),这样就可以把Company对象和相关的Position对象同时删除。 3. Upda

22、teObjectContext 中存在方法 ObjectContext.ApplyCurrentValues<TEntity> 和 ObjectContext.ApplyOriginalValues<TEntity>,用于把将标量值从实体复制到ObjectContext 中具有相同主键的对象集中。注意:在调用此方法前必须把实体预先加载到当前上下文当中,要不然系统将会显示 “objectstatemanager 无法跟踪具有相同键的多个对象” 的错误。由于DAL层的对象大部分使用单体模式进行开发,而BaseCommand是一个共用对象,在共同操作时,Create、Dele

23、te、Read 等操作一般不会对实体造成逻辑性的影响。但如果有多个实体同时调用 Update 操作,就有可能对实体造成逻辑性影响。为了避免这一事件的发生,此处使用方法锁定的模式,以 lock(object) 锁定某一对象,以确保在同一时间内只会对一个实体进行更新。首先通过反射方式获取对象的Id,然后通过 ObjectContext.GetObjectByKey(entityKey) 方法把实体加载到当前上下文当中,最后利用 ObjectContext.ApplyCurrentValues<TEntity> 方法,把新加入的实体的属性复制当前上下文。 1 public class B

24、aseCommand 2 3 private object o = new object(); 4 5 public int Update<T>(T entity) where T : EntityObject 6 7 lock (o) 8 9 int changedCount = 0;10 Type type = typeof(T);11 12 try13 14 using (BasicArchitectureEntities context = new BasicArchitectureEntities()15 16 /获取实体的Id属性17 PropertyInfo prop

25、erty = type.GetProperty(Id);18 object id = property.GetValue(entity, null);19 /根据Id获取上下文中的对应实体20 EntityKey entityKey = new EntityKey(BasicArchitectureEntities. 21 + type.Name, Id, id);22 var objResult = context.GetObjectByKey(entityKey);23 /更新实体属性24 if (objResult != null)25 context.ApplyCurrentValue

26、s<T>(type.Name, entity);26 27 changedCount = context.SaveChanges();28 if (changedCount > 0)29 context.AcceptAllChanges();30 31 32 catch (Exception ex)33 . 34 return changedCount;35 36 37 在一对多,多对一关系时,也可以使用以下方法进行导航属性的同步更新。首先通过反射获取主实体的主键Id,然后建立EntityKey对象,再通过ObjectContext.GetObjectByKey(entity

27、Key)方法在当前上下文当中获取此实体,最后通过 ObjectContext.ApplyCurrentValues<TEntity> 方法,把新加入的实体的属性复制当前上下文。下一步就是对导航属性进行更新,首先通过反射获取外键属性,然后对一对多,多对一的关系进行分别处理。在一对多关系时,把导航属性转换成EntityCollection<T2>对象集合,然后通过ObjectContext.ApplyCurrentValues<TEntity> 方法对集合中的每个对象进行逐个更新。在多对一关系时,直接把导航属性转换成T2类型的对象进行更新。 1 public i

28、nt Update<T1, T2>(T1 entity) 2 where T1 : EntityObject 3 where T2 : EntityObject 4 5 lock (o) 6 7 int changedCount = 0; 8 Type typeT1 = typeof(T1); 9 Type typeT2 = typeof(T2);10 try11 12 using (BasicArchitectureEntities context = new BasicArchitectureEntities()13 14 PropertyInfo property = typ

29、eT1.GetProperty(Id);15 object id = property.GetValue(entity, null);16 17 /根据软件Id建立EntityKey对象18 EntityKey entityKey = new EntityKey(BasicArchitectureEntities. 19 + typeT1.Name, Id, id);20 /根据EntityKey查找对应对象21 T1 objT1 = context.GetObjectByKey(entityKey) as T1;22 /在上下文中更新当前对象23 if (objT1 != null)24 c

30、ontext.ApplyCurrentValues<T1>(typeT1.Name, entity);25 26 /获取外键属性27 PropertyInfo propertyInfo = typeT1.GetProperty(typeT2.Name);28 29 /在一对多关键时更新导航属性30 var T2List = propertyInfo.GetValue(entity, null) 31 as EntityCollection<T2>32 if (T2List != null)33 34 foreach (var obj in T2List.ToList()35 36 var oldEntity = context.GetObjectByKey(obj.EntityKey);37 if (oldEntity != null)38 context.ApplyCurrentValues<T2>(typeT2.Name, obj);39 40 41 42 /在多对一,一对一关系时更新导航属性43 var objT2 = propertyInfo.Ge

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1