在項目中會有很多常用的操作方法如添加、刪除、修改等,而在使用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 }
(完)
