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);
}
你覺得怎樣呢?有什麼建議麼?
一些要求我把:
- 服務代碼要給僅存儲庫和實體方法
- 庫應是通用
- 實體無權訪問對象上下文
這樣我必須讓實體知道EF的ObjectContext。你能指出我如何避免它的任何參考? –
我不明白你到底想要什麼。你想用EF調用存儲過程嗎? – buda
例如,您可以使用Enterprise Library來創建通用存儲過程執行,並且只需要獲取連接即可使用上下文。 – buda