簡體   English   中英

實體框架,更新記錄問題

[英]Entity Framework, Updating a record issue

我一直在環顧四周,但似乎找不到解決方法。 我不確定為什么,但是db.SaveChages()沒有將更改保存到數據庫。

我想做的是將視圖計數器增加1。

PictureViewCounter首先調用GetSinglePicture,它返回圖片記錄。

PictureHelper.PictureViewCounter(PictureHelper.GetSinglePicture(userID,pic), (List<int>)Session["ViewedPictures"], pic);

PictureViewCounter首先調用GetSinglePicture,它返回圖片屬性。

public static Picture GetSinglePicture(int userID, int picture)
    {
        DBContext db = new DBContext();

        return (from p in db.Pictures
                where userID == p.UserID && picture == p.Url
                select p).First();
    }

然后,PictureViewCounter遍歷pictureArray的數組,並查看是否存在匹配項(如果沒有匹配項),則增加圖片。

        public static void PictureViewCounter(Picture picture, List<int> pictureArray, int pictureUrl)
    {
        PetscoveryDBContext db = new PetscoveryDBContext();
        if (pictureArray == null)
        {
            //Automatically +1 picture views
            picture.Views++;
            db.SaveChanges(); //does not save
        }
        else
        {
            int result = pictureArray.Find(pic => pic == pictureUrl);
            //if result == 0 increase picture views by 1
            picture.Views++;
            db.SaveChanges(); //does not save
        }
    }

它在調試時有效,視圖確實增加了,只是沒有保存。 這可能非常簡單。

謝謝

Picture實體來自不同的上下文( DBContext ),並且您正在不同的上下文( PetscoveryDBContext )上執行db.SaveChanges

因此更改不會保存到數據庫中。

它們需要處於相同的上下文中,或者您需要使用Attach方法。

另外,您的代碼不會更早地釋放連接。 稍微重構的方法是:

public static void UpdatePictureViewCounter(int userId, List<int> pictureArray, 
                                            int pictureUrl)
{
    if (pictureArray == null || !pictureArray.Contains(pictureUrl))
    {
        // increment the view.

        using (var db = new PetscoveryDBContext())
        {
            var picture = (from p in db.Pictures where userID == 
                          p.UserID && pictureUrl == p.Url select p).First();
            ++picture.Views;

            db.SaveChanges();
        }
    }
}

使用上面的代碼,我們甚至不需要查詢數據庫。 當滿足條件時,我們查詢數據庫,獲取Picture實體,對其進行更新,將其保存回去並處置連接。

根據我看到的代碼,您的Picture實例似乎來自其他PetscoveryDBContext 從上下文檢索對象時,該上下文會為您跟蹤對該實例所做的更改,這樣,當您調用SaveChanges它將知道要向數據庫發出哪些更新語句。

在這種情況下,您已經創建了一個新的上下文,因此它不知道(可能根本不涉及那個Picture實例)發生了什么更改或如何發出更新命令。

我建議看一下這篇文章: 將分離的實體保存在Entity Framework 6中以獲取更多信息。

您將更改保存在錯誤的上下文中,因此EF無法跟蹤圖片對象。 我會稍微重構您的代碼:

public static Picture UpdatePictureViews(int userID, int picture)
{
    DBContext db = new DBContext();

    var picture =  (from p in db.Pictures
                    where userID == p.UserID && picture == p.Url
                    select p).First();

    if(PictureViewCounter(picture, pictureArray, pictureUrl))
    {
        picture.Views++;
        db.SaveChanges();
    }
}

public static bool PictureViewCounter(Picture picture, List<int> pictureArray, int pictureUrl)
{
    //In here basically return true if you want to increase the view count
    if (pictureArray == null)
    {
        //Automatically +1 picture views
        return true;
    }
    else
    {
        int result = pictureArray.Find(pic => pic == pictureUrl);
        //if result == 0 increase picture views by 1
        return true;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM