2009-12-29 124 views
1

早些時候,我創建了一個AddClient頁面(發佈時)傳遞客戶端對象,並在存儲庫中使用db.AddToClient(obj)來保存它。簡單的東西。模型綁定實體框架(ASP.NET MVC)

現在,我有一個詳細信息頁面,其保存提交一個帖子到一個動作「UpdateClient」。在這個動作被擊中之前,我的自定義模型綁定器創建了我的Client對象,並將它方便地傳遞給動作。問題是,這個客戶端對象還沒有連接到EF上下文。哪裏是正確的地方呢?在模型綁定器中,或者當我們從控制器中獲取它,或者我們等待直到我們執行存儲庫調用並將它連接到那裏?什麼是推薦的過程?

回答

-1

數據庫工作應放在存儲庫調用中。

您是否直接綁定到模型綁定中的實體框架對象?如果沒有,你應該考慮在自定義對象和實體框架對象之間做一些映射。

+0

我的數據庫調用存儲在庫中。我試圖找出什麼時候打電話給他們以最大限度地利用EF。至於你的問題,我試圖用這些問題來確定。看起來我最好使用EF,如果我模型綁定查詢EF對象提前,以便它可以使用併發性和更好的跟蹤狀態。 – RailRhoad 2009-12-29 16:36:58

+0

我不會將EF對象直接暴露給「模型綁定」,我將使用自己的域對象或DTO,並將這些對象映射到EF對象上。 – 2009-12-29 18:38:51

0

如果在上下文之外創建了EF對象,則需要將附加到對象上下文中。

參見:http://msdn.microsoft.com/en-us/library/bb896271.aspx

+0

如果我在完成對象之後等待附加,請不要失去EF的併發檢查的好處?另外,該附加看看我的對象,並在數據庫中同步到一個? – RailRhoad 2009-12-29 16:29:41

+0

另外,將對象附加到上下文會使其保持不變的狀態。我不想先查詢它(在模型綁定之前),然後讓它綁定。那麼它可以正確地確定國家的權利? – RailRhoad 2009-12-29 16:33:58

+0

Attached對象將是一個新對象,如果您想更新現有對象,您需要先從數據庫中獲取它,進行更改並保存更改。 – 2009-12-29 16:57:40

0

我知道這是一個古老的線程,但在新讀者的興趣:

基於使用VS 2012,MVC 4和EF 4.0與具有EF對象爲提交的模型視圖我的看法形成回控制器。

在控制器:

public ActionResult SubmitEFObject(tblData data, FormCollection col) 

「數據」 將只具有在填充視圖(@ Html.xxxFor)中使用的性質。

看起來,當創建「數據」時,發佈的FormCollection用於設置數據的屬性。如果您有一個未使用的屬性,例如DataID,則data.DataID將具有空值/默認值。將「@ Html.Hidden(m => m.DataID)」添加到您的視圖中,然後填充DataID。

作爲「快速ñ骯髒」的方式與這個工作,我創建了一個會與數據庫中的「數據」合併進來的「數據」,並返回合併對象的方法:

// Note: error handling removed 
public tblData MergeWithDB(DBContext db, tblData data, params string[] fields) 
{ 
    tblData d = db.tblData.Where(aa => aa.DataID == data.DataID).Single(); 
    if (fields.Contains("Field1")) d.Field1 = data.Field1; 
    if (fields.Contains("Field2")) d.Field2 = data.Field2; 
    if (fields.Contains("Field3")) d.Field3 = data.Field3; 
    // etc... 
    return d; 
} 

在控制器:

public ActionResult SubmitEFObject(tblData data, FormCollection col) 
{ 
    DataEntities db = new DataEntities(); 
    tblData d = MergeWithDB(db, data, col.AllKeys); 
    db.SaveChanges(); 
} 

你可以讓這個更通用的使用反射或也許更有效的通過字符串[]字段,而不是所有的IFS循環,但對於我而言,這是「足夠好」。