项目使用Entity Framework用到的公共操作方法基类(Repository)及其使用
在项目中会有很多常用的操作方法如添加、删除、修改等,而在使用EF时虽然已是ORM,但仍然会习惯性的在业务层写大量类似方法,为此,分享一个我在项目使用的公共基类,经过多次修改,已在mssql和oracle数据库项目上使用没问题。希望对使用EF开发项目的朋友有帮助,不是说写的有多好,只是为了分享,因为我在使用EF之初也一直在找这样一个类但资源很少。 欢迎拍砖,不要伤人就行。。。
以下是 Repository.cs源码 :
Repository.cs
1 using System.Collections.Generic; 2 using System.Linq; 3 using System.Linq.Expressions; 4 using System.Data.Objects; 5 using System.Data.Common; 6 using System.Transactions; 7 8 namespace System.Data.Entity 9 { 10 public class Repository<TEntity> : IDisposable where TEntity : class 11 { 12 #region 私有属性 13 private ObjectContext objectContext; 14 private string entitySetName; 15 private string keyProperty = "ID"; 16 private string keyPropertyType = "Int32"; 17 #endregion 18 19 #region 公共属性 20 /// <summary> 21 /// 获得提供用于查询和使用对象形式的实体数据功能 22 /// </summary> 23 protected ObjectContext ObjContext 24 { 25 get 26 { 27 if (this.objectContext == null) 28 { 29 throw new Exception("数据库对象为空"); 30 } 31 if (this.objectContext.Connection.State == System.Data.ConnectionState.Closed) 32 { 33 this.objectContext.Connection.Open(); //如果关闭则打开 34 } 35 return this.objectContext; 36 } 37 set 38 { 39 this.objectContext = value; 40 objectContext.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly); 41 } 42 } 43 /// <summary> 44 /// 实体名字 45 /// </summary> 46 public string EntitySetName 47 { 48 get { return this.entitySetName; } 49 } 50 /// <summary> 51 /// 主键字段名 52 /// </summary> 53 public string KeyProperty 54 { 55 get { return this.keyProperty; } 56 } 57 /// <summary> 58 /// 主键字段类型 59 /// </summary> 60 public string KeyPropertyType 61 { 62 get { return this.keyPropertyType; } 63 } 64 #endregion 65 66 #region objectContext 67 /// <summary> 68 /// 69 /// </summary> 70 public Repository() 71 : this(null) 72 { 73 } 74 /// <summary> 75 /// 用指定上下文构造新的实例 76 /// </summary> 77 /// <param name="objectContext">特定的上下文实例</param> 78 public Repository(ObjectContext objectContext) 79 { 80 if (objectContext != null) //也可以构造后再指定数据库 81 { 82 this.objectContext = objectContext; //指定数据库 83 } 84 85 Type entityType = typeof(TEntity); 86 //表名 87 this.entitySetName = entityType.Name; 88 //主键 89 foreach (var prop in entityType.GetProperties()) 90 { 91 var attr = prop.GetCustomAttributes(typeof(System.Data.Objects.DataClasses.EdmScalarPropertyAttribute), false).FirstOrDefault() as System.Data.Objects.DataClasses.EdmScalarPropertyAttribute; 92 if (attr != null && attr.EntityKeyProperty) 93 { 94 this.keyProperty = prop.Name; 95 this.keyPropertyType = prop.PropertyType.Name; 96 break; 97 } 98 } 99 100 if (objectContext != null) 101 { 102 objectContext.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly); 103 } 104 } 105 /// <summary> 106 /// 释放对象上下文使用的资源 107 /// </summary> 108 public void Dispose() 109 { 110 CloseObjectContext(); 111 } 112 /// <summary> 113 /// 释放ObjectContext连接 114 /// </summary> 115 public void CloseObjectContext() 116 { 117 if (objectContext != null ) 118 { 119 if (objectContext.Connection.State == ConnectionState.Open) 120 { 121 objectContext.Connection.Close(); 122 } 123 objectContext.Dispose(); 124 } 125 } 126 #endregion 127 128 #region Find 条件表达式查询 129 /// <summary> 130 /// 所有数据的查询列表 131 /// </summary> 132 /// <returns></returns> 133 public IQueryable<TEntity> FindAll() 134 { 135 return objectContext.CreateObjectSet<TEntity>().AsQueryable(); 136 } 137 138 /// <summary> 139 /// 根据指定条件表达式得到数据查询列表 140 /// </summary> 141 /// <param name="exp">条件表达式</param> 142 /// <returns></returns> 143 public IQueryable<TEntity> FindAll(Expression<Func<TEntity, bool>> exp) 144 { 145 return objectContext.CreateObjectSet<TEntity>().Where(exp); 146 } 147 148 /// <summary> 149 /// 根据指定条件表达式得到数据实体 150 /// </summary> 151 /// <param name="exp">条件表达式</param> 152 /// <returns></returns> 153 public TEntity Find(Expression<Func<TEntity, bool>> exp) 154 { 155 return objectContext.CreateObjectSet<TEntity>().FirstOrDefault(exp); 156 } 157 #endregion 158 159 #region GetQuery ESQL查询 160 /// <summary> 161 /// ESQL查询 162 /// </summary> 163 /// <param name="query">ESQL语句</param> 164 /// <param name="parameter">参数(可选)</param> 165 /// <returns></returns> 166 /// <remarks>可用.Execute(MergeOption.AppendOnly)执行查询</remarks> 167 public ObjectQuery<TEntity> GetQuery(string query, params ObjectParameter[] parameter) 168 { 169 return objectContext.CreateQuery<TEntity>(query, parameter); 170 } 171 172 /// <summary> 173 /// ESQL查询列表 174 /// </summary> 175 /// <param name="query">ESQL语句</param> 176 /// <param name="parameter">参数(可选)</param> 177 /// <returns></returns> 178 /// <remarks>可用.Execute(MergeOption.AppendOnly)执行查询</remarks> 179 public List<TEntity> GetListByQuery(string query, params ObjectParameter[] parameter) 180 { 181 return objectContext.CreateQuery<TEntity>(query, parameter).ToList(); 182 } 183 /// <summary> 184 /// ESQL查询 185 /// </summary> 186 /// <param name="query">ESQL语句</param> 187 /// <param name="parameter">参数(可选)</param> 188 /// <returns></returns> 189 /// <remarks>可用.Execute(MergeOption.AppendOnly)执行查询</remarks> 190 public ObjectQuery<Object> GetObjectQuery(string query, params ObjectParameter[] parameter) 191 { 192 return objectContext.CreateQuery<Object>(query, parameter); 193 } 194 /// <summary> 195 /// ESQL查询,返回单值Object 196 /// </summary> 197 /// <param name="query">ESQL语句</param> 198 /// <param name="parameter">参数(可选)</param> 199 /// <returns></returns> 200 /// <remarks>用.Execute(MergeOption.AppendOnly)查询</remarks> 201 public Object GetObjectByQuery(string query, params ObjectParameter[] parameter) 202 { 203 return GetObjectQuery(query, parameter).Execute(MergeOption.AppendOnly).FirstOrDefault(); 204 } 205 #endregion 206 207 #region GetList 返回List列表 208 /// <summary> 209 /// 所有数据列表 210 /// </summary> 211 /// <returns></returns> 212 public List<TEntity> GetList() 213 { 214 return objectContext.CreateObjectSet<TEntity>().AsQueryable().ToList(); 215 } 216 217 /// <summary> 218 /// 根据指定表达式得到数据列表 219 /// </summary> 220 /// <returns></returns> 221 public List<TEntity> GetList(Expression<Func<TEntity, bool>> exp) 222 { 223 return objectContext.CreateObjectSet<TEntity>().Where(exp).ToList(); 224 } 225 226 #endregion 227 228 #region Add 添加实体数据 229 /// <summary> 230 /// 添加实体数据 231 /// </summary> 232 /// <param name="entity">实体</param> 233 public int Add(TEntity entity) 234 { 235 objectContext.CreateObjectSet<TEntity>().AddObject(entity); 236 return objectContext.SaveChanges(); 237 } 238 /// <summary> 239 /// 添加实体数据 240 /// </summary> 241 /// <param name="entity">实体</param> 242 /// <param name="options">SaveOptions: 243 /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。 244 /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。 245 /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。 246 /// </param> 247 public int Add(TEntity entity, SaveOptions options) 248 { 249 objectContext.CreateObjectSet<TEntity>().AddObject(entity); 250 return objectContext.SaveChanges(options); 251 } 252 253 /// <summary> 254 /// 批量添加实体数据 255 /// </summary> 256 /// <param name="entitys">实体列表</param> 257 public int AddAll(IEnumerable<TEntity> entitys) 258 { 259 foreach (var entity in entitys) 260 { 261 objectContext.CreateObjectSet<TEntity>().AddObject(entity); 262 } 263 return objectContext.SaveChanges(); 264 } 265 /// <summary> 266 /// 批量添加实体数据 267 /// </summary> 268 /// <param name="entitys">实体列表</param> 269 /// <param name="options">SaveOptions: 270 /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。 271 /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。 272 /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。 273 /// </param> 274 public int AddAll(IEnumerable<TEntity> entitys, SaveOptions options) 275 { 276 var objSet = objectContext.CreateObjectSet<TEntity>(); 277 foreach (var entity in entitys) 278 { 279 objSet.AddObject(entity); 280 } 281 return objectContext.SaveChanges(options); 282 } 283 #endregion 284 285 #region Delete 删除实体数据 286 /// <summary> 287 /// 删除实体数据 288 /// </summary> 289 /// <param name="entity">实体</param> 290 public int Delete(TEntity entity) 291 { 292 objectContext.CreateObjectSet<TEntity>().DeleteObject(entity); 293 return objectContext.SaveChanges(); 294 } 295 296 /// <summary> 297 /// 批量删除实体数据 298 /// </summary> 299 /// <param name="entitys">实体列表</param> 300 public int DeleteAll(IEnumerable<TEntity> entitys) 301 { 302 if (entitys != null && entitys.Count() > 0) 303 { 304 foreach (var entity in entitys) 305 { 306 objectContext.CreateObjectSet<TEntity>().DeleteObject(entity); 307 } 308 return objectContext.SaveChanges(); 309 } 310 return 0; 311 } 312 #endregion 313 314 #region Save 保存实体 315 /// <summary> 316 /// 保存实体和变动 317 /// </summary> 318 /// <returns></returns> 319 public int Save() 320 { 321 return objectContext.SaveChanges(); 322 } 323 /// <summary> 324 /// 保存实体和变动 325 /// </summary> 326 /// <param name="options">SaveOptions: 327 /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。 328 /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。 329 /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。 330 /// </param> 331 public int Save(SaveOptions options) 332 { 333 return objectContext.SaveChanges(options); 334 } 335 /// <summary> 336 /// 保存指定的实体变动 337 /// </summary> 338 /// <param name="entity">实体列表</param> 339 /// <returns></returns> 340 public int Save(TEntity entity) 341 { 342 objectContext.AttachTo(this.entitySetName, entity); 343 objectContext.SetAllModified(entity); 344 return objectContext.SaveChanges(); 345 } 346 /// <summary> 347 /// 保存指定的实体变动 348 /// </summary> 349 /// <param name="entity">实体列表</param> 350 /// <param name="options">SaveOptions: 351 /// AcceptAllChangesAfterSave:把数据保存到数据库以后重置实体的状态。 352 /// DetectChangesBeforeSave:把数据保存到数据库之前同步实体的状态。 353 /// None:把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。 354 /// </param> 355 public int Save(TEntity entity, SaveOptions options) 356 { 357 objectContext.AttachTo(this.entitySetName, entity); 358 objectContext.SetAllModified(entity); 359 return objectContext.SaveChanges(options); 360 } 361 #endregion 362 363 /// <summary> 364 /// 将对象或对象图附加到本实体集中的对象上下文。 365 /// </summary> 366 /// <param name="entity"> 要附加的 System.Object。</param> 367 public void AttachTo(TEntity entity) 368 { 369 objectContext.AttachTo(this.entitySetName, entity); 370 } 371 /// <summary> 372 /// 将对象或对象图附加到特定实体集中的对象上下文。 373 /// </summary> 374 /// <param name="entitySetName"> 表示实体集名称,可以选择通过实体容器名称对它进行限定。</param> 375 /// <param name="entity"> 要附加的 System.Object。</param> 376 public void AttachTo(string entitySetName, TEntity entity) 377 { 378 objectContext.AttachTo(entitySetName, entity); 379 } 380 /// <summary> 381 /// 在对象具有实体键时将对象或对象图附加到对象上下文。 382 /// </summary> 383 /// <param name="entity">要附加的对象。</param> 384 public void Attach(System.Data.Objects.DataClasses.IEntityWithKey entity) 385 { 386 objectContext.Attach(entity); 387 } 388 /// <summary> 389 /// 从对象上下文移除对象。 390 /// </summary> 391 /// <param name="entity">要分离的对象。仅移除 entity;如果有任何相关对象受同一 System.Data.Objects.ObjectStateManager 跟踪,则不会自动分离这些对象。</param> 392 public void Detach(object entity) 393 { 394 objectContext.Detach(entity); 395 } 396 397 #region ExecuteforStore 直接执行数据源语句,如MSSQL、Oracle 398 /// <summary> 399 /// 执行数据源语句(如MSSQL),返回影响的行数 400 /// </summary> 401 /// <param name="commandText">查询语句</param> 402 /// <param name="parameter">参数(可选)</param> 403 /// <returns></returns> 404 public int ExecuteStoreCommand(string commandText, params ObjectParameter[] parameter) 405 { 406 if (string.IsNullOrEmpty(commandText)) 407 { 408 return 0; 409 } 410 return objectContext.ExecuteStoreCommand(commandText, parameter); 411 } 412 413 /// <summary> 414 /// 执行数据源查询语句(如MSSQL),获得数据查询列表 415 /// </summary> 416 /// <param name="commandText">查询语句</param> 417 /// <param name="parameter">参数(可选)</param> 418 /// <returns></returns> 419 public ObjectResult<TEntity> ExecuteStoreQuery(string commandText, params ObjectParameter[] parameter) 420 { 421 return objectContext.ExecuteStoreQuery<TEntity>(commandText, parameter); 422 } 423 424 /// <summary> 425 /// 执行数据源的函数或存储过程,返回影响的行数 426 /// </summary> 427 /// <param name="functionName">函数或存储过程</param> 428 /// <param name="parameter">参数(可选)</param> 429 /// <returns></returns> 430 public int ExecuteFunction(string functionName, params ObjectParameter[] parameter) 431 { 432 if (string.IsNullOrEmpty(functionName)) 433 { 434 return 0; 435 } 436 return objectContext.ExecuteFunction(functionName, parameter); 437 } 438 439 /// <summary> 440 /// 执行数据源的查询函数或存储过程,获得数据查询列表 441 /// </summary> 442 /// <param name="functionName">函数或存储过程</param> 443 /// <param name="parameter">参数(可选)</param> 444 /// <returns></returns> 445 public ObjectResult<TEntity> ExecuteFunctionQuery(string functionName, params ObjectParameter[] parameter) 446 { 447 return objectContext.ExecuteFunction<TEntity>(functionName, parameter); 448 } 449 450 /// <summary> 451 /// 执行数据源语句(如MSSQL),获得得数据列表 452 /// </summary> 453 /// <param name="commandText">查询语句</param> 454 /// <param name="parameter">参数(可选)</param> 455 /// <returns></returns> 456 public List<TEntity> GetListByStoreQuery(string commandText, params ObjectParameter[] parameter) 457 { 458 return objectContext.ExecuteStoreQuery<TEntity>(commandText, parameter).ToList(); 459 } 460 /// <summary> 461 /// 执行数据源的查询函数或存储过程,获得数据列表 462 /// </summary> 463 /// <param name="functionName">函数或存储过程</param> 464 /// <param name="parameter">参数(可选)</param> 465 /// <returns></returns> 466 public List<TEntity> GetListByFunction(string functionName, params ObjectParameter[] parameter) 467 { 468 return objectContext.ExecuteFunction<TEntity>(functionName, parameter).ToList(); 469 } 470 #endregion 471 472 #region ByID 对主键相关操作 473 /// <summary> 474 /// 获得指定主键的实体 475 /// </summary> 476 /// <param name="id">主键值</param> 477 /// <returns></returns> 478 public virtual TEntity GetByID(object id) 479 { 480 EntityKey ek = new EntityKey(objectContext.DefaultContainerName + "." + this.entitySetName, this.keyProperty, id); 481 object entity = null; 482 objectContext.TryGetObjectByKey(ek, out entity); 483 return (entity as TEntity); 484 } 485 486 /// <summary> 487 /// 获得指定主键的实体列表 488 /// </summary> 489 /// <param name="ids">用逗号(,)分隔的主键ID</param> 490 /// <returns></returns> 491 public virtual List<TEntity> GetListByIDs(string ids) 492 { 493 ids = SqlFilter(ids); 494 if ("string".Equals(this.keyPropertyType, StringComparison.OrdinalIgnoreCase)) 495 { 496 ids = "'" + ids.Replace(",", "','") + "'"; 497 } 498 string query = "select value it from " + this.entitySetName + " as it where it." + this.keyProperty + " in {" + ids + "}"; 499 return objectContext.CreateQuery<TEntity>(query).ToList(); 500 } 501 /// <summary> 502 /// 获得指定主键的实体列表 503 /// </summary> 504 /// <param name="ids">主键ID列表</param> 505 /// <returns></returns> 506 public virtual List<TEntity> GetListByIDs(IEnumerable<object> ids) 507 { 508 string strIDs = string.Empty; 509 foreach (int id in ids) 510 { 511 strIDs += "," + id.ToString(); 512 } 513 if (strIDs.Length > 1) 514 { 515 strIDs = strIDs.Substring(1); 516 } 517 return GetListByIDs(strIDs); 518 } 519 520 /// <summary> 521 /// 删除指定ID的实体。 522 /// 注意:此处直接执行数据源语句 523 /// </summary> 524 /// <param name="ids">用逗号(,)分隔的主键ID</param> 525 /// <returns></returns> 526 public virtual int DeleteByIDs(string ids) 527 { 528 if (string.IsNullOrEmpty(ids)) 529 { 530 return 0; 531 } 532 ids = SqlFilter(ids); 533 if ("string".Equals(this.keyPropertyType, StringComparison.OrdinalIgnoreCase)) 534 { 535 ids = "'" + ids.Replace(",", "','") + "'"; 536 } 537 string sql = string.Format("delete {0} where {1} in({2})", this.entitySetName, this.keyProperty, ids); 538 return ExecuteStoreCommand(sql); 539 } 540 541 /// <summary> 542 /// 删除指定ID组的实体 543 /// </summary> 544 /// <param name="ids">主键ID列表</param> 545 /// <returns></returns> 546 public virtual int DeleteByIDs(IEnumerable<object> ids) 547 { 548 string strIDs = string.Empty; 549 foreach (int id in ids) 550 { 551 strIDs += "," + id.ToString(); 552 } 553 if (strIDs.Length > 1) 554 { 555 strIDs = strIDs.Substring(1); 556 } 557 return DeleteByIDs(strIDs); 558 } 559 #endregion 560 561 #region 事务 562 /// <summary> 563 /// TransactionScope事务处理。 564 /// TransactionScopeOption 默认值为 Required。 565 /// 用 .Complete() 提交事务 566 /// </summary> 567 /// <returns>返回 TransactionScope</returns> 568 public TransactionScope GetTransactionScope() 569 { 570 return (new TransactionScope(TransactionScopeOption.Required)); 571 } 572 /// <summary> 573 /// TransactionScope事务处理。 574 /// 用 .Complete() 提交事务 575 /// </summary> 576 /// <param name="scopeOption">提供用于创建事务范围的附加选项: 577 /// Required:该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。 578 /// RequiresNew:总是为该范围创建新事务。 579 /// Suppress:环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。 580 /// </param> 581 /// <returns>返回 TransactionScope</returns> 582 public TransactionScope GetTransactionScope(TransactionScopeOption scopeOption) 583 { 584 return (new TransactionScope(scopeOption)); 585 } 586 /// <summary> 587 /// TransactionScope事务处理。 588 /// 用 .Complete() 提交事务 589 /// </summary> 590 /// <param name="scopeOption">提供用于创建事务范围的附加选项: 591 /// Required:该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。 592 /// RequiresNew:总是为该范围创建新事务。 593 /// Suppress:环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。 594 /// </param> 595 /// <param name="scopeTimeout">在它之后,事务范围将超时并中止此事务。</param> 596 /// <returns>返回 TransactionScope</returns> 597 public TransactionScope GetTransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout) 598 { 599 return (new TransactionScope(scopeOption, scopeTimeout)); 600 } 601 602 /// <summary> 603 /// TransactionScope事务处理。 604 /// 用 .Complete() 提交事务 605 /// </summary> 606 /// <param name="transactionToUse">要设置为环境事务(以便该范围中进行的事务性工作使用此事务)的事务。</param> 607 /// <returns>返回 TransactionScope</returns> 608 public TransactionScope GetTransactionScope(Transaction transactionToUse) 609 { 610 return (new TransactionScope(transactionToUse)); 611 } 612 /// <summary> 613 /// TransactionScope事务处理。 614 /// 用 .Complete() 提交事务 615 /// </summary> 616 /// <param name="transactionToUse">要设置为环境事务(以便该范围中进行的事务性工作使用此事务)的事务。</param> 617 /// <param name="scopeTimeout">在它之后,事务范围将超时并中止此事务。</param> 618 /// <returns>返回 TransactionScope</returns> 619 public TransactionScope GetTransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout) 620 { 621 return (new TransactionScope(transactionToUse, scopeTimeout)); 622 } 623 624 /// <summary> 625 /// TransactionScope事务处理。 626 /// 用 .Complete() 提交事务 627 /// </summary> 628 /// <param name="scopeOption">提供用于创建事务范围的附加选项: 629 /// Required:该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。 630 /// RequiresNew:总是为该范围创建新事务。 631 /// Suppress:环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。 632 /// </param> 633 /// <param name="transactionOptions">包含指定事务行为的附加信息。</param> 634 /// <returns>返回 TransactionScope</returns> 635 public TransactionScope GetTransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions) 636 { 637 return (new TransactionScope(scopeOption, transactionOptions)); 638 } 639 640 #endregion 641 642 #region 辅助方法 643 /// <summary> 644 /// sql注入过滤 645 /// </summary> 646 /// <param name="sqlString"></param> 647 /// <returns></returns> 648 public string SqlFilter(string sqlString) 649 { 650 return sqlString 651 .Replace("'", "''"); 652 } 653 #endregion 654 } 655 656 }
ObjectContext扩展类ObjectContextExtension.cs
ObjectContextExtension.cs
1 using System.Linq; 2 using System.Data.Objects; 3 using System.Collections; 4 5 namespace System.Data.Objects 6 { 7 /// <summary> 8 /// ObjectContext扩展 9 /// </summary> 10 public static class ObjectContextExtension 11 { 12 /// <summary> 13 /// 把所有属性都标为已修改 14 /// </summary> 15 /// <param name="objectContext"></param> 16 /// <param name="item"></param> 17 public static void SetAllModified(this ObjectContext objectContext, object item) 18 { 19 ObjectStateEntry stateEntry = objectContext.ObjectStateManager.GetObjectStateEntry(item) as ObjectStateEntry; 20 IEnumerable propertyNameList = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name); 21 foreach (string propName in propertyNameList) 22 { 23 stateEntry.SetModifiedProperty(propName); 24 } 25 stateEntry.SetModified(); 26 } 27 } 28 }
使用上可以用以下结构:
1. 建一个base业务类,代码如下:
BaseService.cs
1 public class BaseService<TEntity> : Repository<TEntity> where TEntity : System.Data.Objects.DataClasses.EntityObject //或用class 2 { 3 public BaseService() 4 : base(new OA.Data.OAEntities())//默认数据库 5 { 6 } 7 public BaseService(System.Data.Objects.ObjectContext objContext) 8 : base(objContext) 9 { 10 } 11 /// <summary> 12 /// 为其它Service指定与本Service相同的ObjContext数据对象 13 /// </summary> 14 /// <param name="newService">目标Service</param> 15 protected dynamic SameObjContext(dynamic service) 16 { 17 service.ObjContext = this.ObjContext; 18 return service; 19 } 20 }
2.业务层的每个业务类都继承BaseService,如针对Department的业务层DepartmentService.cs代码:
DepartmentService.cs
1 public class DepartmentService : BaseService<Department> 2 { 3 }
(完)