2

我真的很難找出EF上下文在MVC應用程序中的管理位置。實體框架上下文?

我正在使用Service/Repository/EF方法,並使用UnitOfWork模式以及其內部的上下文進行播放,然後在控制器操作內部使用它來利用各種服務。它的工作原理,但通過這樣做,我使控制器依賴EF正確嗎?

有什麼建議嗎?

回答

1

如果您依賴抽象並創建封裝EF上下文的IUnitOfWork和IRepository,Controller將依賴於抽象而不是任何具體的實現。

存儲庫和工作單元本身是唯一依賴實體框架或您正在使用的任何ORM的類。

public class MyController : Controller 
{ 
    public MyController(IRepository r1, IRepository r2, IUnitOfWork uow) 
    { ... } 

    [HttpPost] 
    public ActionResult SomeAction(Model data) 
    { 
    _r1.DoSomeChangesToEntities(data); 
    _r2.DoSomeChangesToEntities(data); 
    _uow.SaveChanges(); 
    return View(...); 
    } 
} 

編輯爲每個請求:

一個簡單的工作單元實現可能是:

public class EFUnitOfWork : IUnitOfWork 
{ 
    private DataContext _context; 

    public EFUnitOfWork(DataContext context) 
    { 
    _context = context; 
    } 

    public void Commit() 
    { 
    _context.SubmitChanges(); 
    } 
} 

你當然會確保您的服務/資源庫使用相同的上下文向工作單位注入相同的背景。

+0

@PH - 你能告訴我IUnitOfWork將是什麼樣子? – Sam 2011-03-04 08:33:40

+1

@Sam - 增加了UnitOfWork的例子 – PHeiberg 2011-03-04 19:30:28

0

這取決於你的意思是「使控制器依賴於EF」?

你在控制器中使用任何EF相關的類嗎?如果不是,他們顯然不依賴於EF,並且您可以輕鬆地將您的存儲庫和工作單元交換爲其他實現(例如使用NHibernate)。

但是,整個你的asp.net mvc應用程序是依賴於EF如果你在任何層使用它 - 它不會運行沒有加載EF dll。

+0

那麼UnitOfWork應該在哪一層生活? – Sam 2011-03-04 17:29:33

+0

@Sam:我想你最近幾天已經問過這幾次了,你有答案。檢查他們。沒有理由每天再問一次。 – 2011-03-04 18:23:21

0

退房示例代碼在http://efmvc.codeplex.com/

+1

雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 – Benjol 2011-03-04 14:24:35

相關問題