0

我在服務這個公共操作中的存儲過程:需要調用實體

void IApplicationService.DeleteApplication(int id) 
    { 
     var repository = UnitOfWork.CreateRepository<Application>(); 

     var application = repository.GetByKey(id); 
     OnCommit.Run(() => DeleteInvitations(id)); // ouch!! 
     repository.Delete(application); 
    } 

OnCommit.Run()安排一個動作來運行,當我打電話調用SaveChanges(),在WCF檢查落實。 DeleteInvitations有權訪問對象上下文並調用存儲過程來刪除集合application.Invitations中的每個項目。我這樣做是爲了避免加載內存中的所有邀請,只在下一步中刪除它們。 My Repository.Delete()依次調用實體中的Delete()。

但我不太喜歡讓服務代碼處理部分刪除操作。我需要訪問我的實體中的存儲過程。

我想我可以創建一個IStoredProcedures接口並將其提供給每個實體。然後,我可以有這樣的事情:

public void Delete() 
    { 
     Contract.Requires(EntityState == System.Data.EntityState.Unchanged); 

     if (Responses.Any()) 
      throw new ValidationException("There are responses."); 

     // *..* relationship, just break that 
     for (int i = Forms.Count - 1; i >= 0; i--) 
     { 
      var form = Forms.ElementAt(i); 
      Forms.Remove(form); 
     } 

     // I could have something like this, perhaps? 
     StoredProcedures.Call("DeleteInvitations", this.Id); 
    } 

你覺得怎樣呢?有什麼建議麼?

一些要求我把:

  • 服務代碼要給僅存儲庫和實體方法
  • 庫應是通用
  • 實體無權訪問對象上下文

回答

0

我沒有看到問題,請你說明你想做什麼。

可以存儲過程添加到您的實體模型,並把它像任何其他方法或/和你可以調用的程序是這樣的:

string sp = "Entities.StoredProcedureName"; 
var conn = (EntityConnection)dbContext.Connection; 
conn.Open(); 
EntityCommand cmd = new EntityCommand(sp, conn); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add("Parameter1", [type]).Value = paramvalue; 
cmd.ExecuteNonQuery(); 

,如果你願意,你可以使這個執行通用的,動態傳遞存儲過程名稱和參數。

我希望我明白你想要什麼。

+0

這樣我必須讓實體知道EF的ObjectContext。你能指出我如何避免它的任何參考? –

+0

我不明白你到底想要什麼。你想用EF調用存儲過程嗎? – buda

+0

例如,您可以使用Enterprise Library來創建通用存儲過程執行,並且只需要獲取連接即可使用上下文。 – buda