我有按钮,按下时 - 控制器动作应该为我的dbTable添加字段(“喜欢”), 并且如果再次按下按钮 - 它应该从dbTable(“喜欢”)中删除 代码(简化):
var like = db.Likes.Find(id);
if (like == null)
{
Like like = new Like("SomeData", UserPosedLike);
db.Add(like);
}
else
{
db.Likes.Remove(like);
}
db.SaveChanges();
它在95%的时候都能正常工作,但是如果我按下按钮非常快2-3次,它会抛出错误 - “Null ref”,Like中的一些数据是NULL(但是这个数据不能为null,因为它引用其他dbField(User))。此外,有时它会增加两个喜欢,但它不应该。
我认为这是因为:
第一个动作(按) - 读取db,开始处理。
第二个动作(第二次按) - 读取db,开始处理。 (第一个动作还没有保存数据)
第一个动作(按) - 保存数据
第二个动作(pess) - 保存数据。
在这里,我们有2个喜欢。可能与“null error”类似的问题。
我收到了锁定这段代码的建议,但我认为这是错误的。我也在考虑乐观并发,目前正在阅读它。
我对db不好,任何帮助都会很棒 - 好书,代码,文章或建议。 谢谢!
答案 0 :(得分:1)
您需要在transaction中读取和写。
using (var db = new YourContext())
{
using (var t = db.Database.BeginTransaction())
{
try
{
var like = db.Likes.Find(id);
if (like == null)
{
Like like = new Like("SomeData", UserPosedLike);
db.Add(like);
}
else
{
db.Likes.Remove(like);
}
db.SaveChanges();
t.Commit();
}
catch
{
t.Rollback();
}
}
}
我收到了锁定这段代码的建议,但我认为这是错误的。
这是错误的。
正如有人在评论中建议的那样,您可以阻止用户多次点击按钮。您可以禁用该按钮并添加微调器。