我一直在四处寻找,但似乎无法找到解决方案。我不确定原因,但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
}
}
它在调试时工作,视图确实增加,只是没有保存。它可能非常简单。
由于
答案 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;
}
}