2011-07-04 70 views
1

當我用模型第一形式給出此代碼工作得很好。如果它是new Vote(),則保存投票。我想模型第一次生成的類在屬性設置器上使用了一些「魔術」,我認爲這就是我們在代碼的第一個屬性中放置了virtual。有沒有辦法讓它工作起來舊式?或者我應該搜索並替換並以某種其他方式將新對象綁定到圖表上?從模型首先遷移到代碼首先,一些重大的變動

public ActionResult Vote(int id, string votetype) 
{ 
    int userid = ViewBag.User.Id; 
    var pub = DB.Publications.Single(p => p.Id == id); 
    var votes = pub.Votes.SingleOrDefault(v => v.MemberId == userid) ?? 
       new Vote 
       { 
        MemberId = userid, 
        Publication = pub 
       }; 
    DB.SaveChanges(); 
    return RedirectToAction("Full", new { id = id }); 
} 
+1

這段代碼應該做什麼?特別是爲什麼'SaveChanges'?您只需從數據庫中查詢實體,但不會更改任何內容,也不會將新實體添加到上下文中。 – Slauma

回答

4

它之前的工作,但它是寫在從一開始就壞的方式,因爲它確實使用了一些內部的魔法,並在您例如,它可以被稱爲副作用。你應該避免通過副作用做一些邏輯的代碼。

神奇的是導航屬性的自動修復起來。您創建一個新的Vote與附加到上下文Publication實例設置其Publication導航屬性。在這種情況下,EF將爲您確定關係,並在內部也將Vote添加到Publication。由於修復,新的Vote也將跟蹤(作爲一個新的實體)。在代碼中使用的第一個沒有,除非你手動編寫,或由模型和數據庫使用的第一POCO T4模板生成的代碼複製他們修復了方法

您的自定義類。如果沒有修復,新的Vote將不會添加到上下文中,並且SaveChanges將不會執行任何修改。

使用@迭戈的代碼來解決你的方法。

+0

很好的解釋。在代碼優先之前我沒有使用EF,也不知道修正魔法。 –

+0

@Diego:在POCO的情況下,它是一個代碼模板將爲您生成,它會導致特別是當與延遲加載相結合,因爲修訂了能夠觸發在相對導航屬性延遲加載了很多的問題。 –

3

在代碼中沒有任何地方告訴EF堅持新的投票。

更改你在哪裏得到/創建票行:

var vote = pub.Votes.SingleOrDefault(v => v.MemberId == userid); 
if (vote == null) 
    pub.Votes.Add(new Vote 
        { 
         MemberId = userid, 
         Publication = pub 
        });