繁体   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