[英]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.