实体框架,更新记录问题

时间:2014-07-23 18:01:33

标签: c# asp.net-mvc linq entity-framework

我一直在四处寻找,但似乎无法找到解决方案。我不确定原因,但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
        }
    }

它在调试时工作,视图确实增加,只是没有保存。它可能非常简单。

由于

3 个答案:

答案 0 :(得分:1)

Picture实体来自不同的上下文(DBContext),而您在不同的上下文(db.SaveChanges)上进行PetscoveryDBContext

因此更改不会保存到数据库中。

他们需要处于相同的上下文中,或者您需要使用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();
        }
    }
}

使用上面的代码,如果不需要,我们甚至不查询数据库。 当条件满足时,我们查询数据库,获取图片实体,更新它,保存并处理连接。

答案 1 :(得分:1)

根据我看到的代码,您的Picture实例似乎来自不同的PetscoveryDBContext。当您从上下文中检索对象时,该上下文会跟踪对您所做的更改,以便在您调用SaveChanges时它知道要向数据库发出哪些更新语句。

在这种情况下,您已经创建了一个新的上下文,因此它根本不知道(可能根本就是Picture个实例)已发生变化或如何发布更新命令。

我建议您查看此帖子:Save detached entity in Entity Framework 6以获取更多信息。

答案 2 :(得分:0)

您正在将更改保存在错误的上下文中,因此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;
    }
}