ObjectContext作为entity framework的最原始的数据上下文对象,它的操作都是具有原始性的,没有被封闭过的,这也就难免在有些功能上欠缺一点,用过DbContext作为EF数据上下文的同学一定有留意到它的Find<TEntity>(params object[] keyValues)方法,不错,它确实比较方便,通过主键(可以是复合主键)来查找实体,这个功能在ObjectContext对象上是没有被提供的,所以,我把这个功能在ObjectContext上实现了一下,现在分享给各位:
1 /// <summary> 2 /// 根据主键得到一个实体 3 /// </summary> 4 /// <typeparam name="TEntity"></typeparam> 5 /// <param name="id"></param> 6 /// <returns></returns> 7 public virtual TEntity GetEntity<TEntity>(params object[] id) where TEntity : class 8 { 9 var count = 0; 10 List<PropertyInfo> res_Primary = new List<PropertyInfo>(); 11 List<EntityKeyMember> keyMemberList = new List<EntityKeyMember>(); 12 PropertyInfo[] properties = typeof(TEntity).GetProperties(); 13 foreach (PropertyInfo pI in properties) 14 { 15 System.Object[] attributes = pI.GetCustomAttributes(true); 16 foreach (object attribute in attributes) 17 { 18 if (attribute is EdmScalarPropertyAttribute) 19 { 20 if ((attribute as EdmScalarPropertyAttribute).EntityKeyProperty && !(attribute as EdmScalarPropertyAttribute).IsNullable) 21 keyMemberList.Add(new EntityKeyMember(pI.Name, id[count])); 22 count++; 23 } 24 25 } 26 } 27 return _db.GetObjectByKey(new EntityKey(_db.DefaultContainerName + "." + typeof(TEntity).Name, keyMemberList)) as TEntity; 28 29 }
术语说明:ObjectSet<T> 相当于是表的结果集,在DbContext环境中叫DbSet<T>
EntityContainerName:EDMX所使用的容器名称
EntityKey:在EF中叫实体键,也叫主键,一个EntityKey叫容器名和一个字典串组成
本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~为ObjectContext类型加个Find方法,如需转载请自行联系原博主。