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