我正在網站上工作,解決方案中有兩個項目是業務邏輯項目和網站項目。我知道我想將實體上下文保留在Web項目之外,只使用框架創建的業務對象,但我無法弄清楚如何以這種方式保存修改後的對象。ASP.NET EntityFramework 4數據上下文問題
比方說,我的實體模型創建這個類:
public class Person //Person entity
{
Int32 Id {get;set;}
String Name {get;set;}
Address Address {get;set;} //Address entity
}
,我創建了這個類來獲得一個特定的人:
public static class PersonController
{
public static Person GetById(int id)
{
using (Entities context = new Entities())
{
return context.Persons.FirstOrDefault(x => x.Id == id);
}
}
}
這讓我通過打電話來想一個人沒有上下文PersonController.GetById(1);我可以在獲取它們後更改人員屬性,但我無法弄清楚如何將修改後的信息保存回數據庫。理想情況下,我想部分類Person,並添加一個.Save()方法,該方法將處理創建一個上下文並將其添加到其中並保存更改。但是當我前一陣子嘗試時,它仍然存在各種各樣的問題,它仍舊附加到舊的上下文中,即使我將它解鎖並將它附加到一個新的上下文,它將作爲EntityState.Unchanged被附加,如果我沒有記錯,那麼當我在附加它後調用context.SaveChages()時,實際上沒有任何更新。
我想我有兩個問題:
1)我要對這個的一個好辦法/有沒有更好的辦法?如果我以一種非常可怕的方式來做這件事,我會很感激一些psudo-code讓我指出正確的方向;一個解釋如何去做這種事情的帖子的鏈接也會起作用。
2)有人可以提供一些保存方法的psudo代碼?如果地址被附加或刪除,save方法也需要處理。
我是一個漂亮的新開發者,所以我沒有很多設計模式的經驗。因此我不知道如何使用存儲庫模式,但我可以查看。爲什麼你不想使用EF生成的對象呢?我認爲EF的重點在於它能夠自動生成對象,並且可以爲您節省時間編碼;這兩方面你都不需要編寫代碼,而且你沒有測試你不寫的代碼。 – William 2010-10-09 19:04:24
那麼有太多的原因,太多不能進入這裏。主要的是可擴展性。如果你讓EF生成你的類,這些類與EF綁定,並且是數據庫感知的。他們需要知道他們如何被使用(映射)。有了POCO,他們不知道。因此,您可以將EF轉換爲nHibernate(例如),而無需額外更改代碼。此外,您的課程現在純粹代表您的領域模型 - 它們不會與導航屬性和事件代表混雜在一起。對於簡單的應用程序(不會長期存在的),EF gen很好。 – RPM1984 2010-10-09 22:30:57
RE測試 - 您不直接測試類,但例如如果您有服務層(大多數應用程序都是這樣),則需要確保您可以創建/檢索/刪除實體。通過使用code-gen,測試服務層時需要參考實體框架。這不應該被要求。你最終得到的是所有項目引用實體框架 - 因此你放棄了「鬆耦合」。 – RPM1984 2010-10-09 22:32:49