保存并编辑到数据库(实体框架)
本文关键字:实体 框架 数据库 编辑 保存 | 更新日期: 2023-09-27 17:58:05
我有Like按钮,当它按下时,控制器操作应该向我的dbTable添加字段("Likes"),如果再次按下按钮,它应该会从dbTable中删除Like("Likes")
此处代码(简化):
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))。此外,有时它会添加两个赞,但不应该。
我认为这是因为:
第一个操作(按)-读取数据库,开始处理
第二次操作(第二次按下)-读取数据库,开始处理。(第一个操作尚未保存数据)
第一步(按)–保存数据
第二个操作(pess)-保存数据
我们得到了2个赞。可能存在类似的"null error"问题。
我收到了锁定此代码块的建议,但我认为这是错误的。我也在思考乐观并发,目前正在阅读它
我不擅长数据库,任何帮助都会很棒——好书、代码、文章或建议。非常感谢。
您需要在事务中读取和写入。
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();
}
}
}
我收到了锁定此代码块的建议,但我认为这是错误的。
这是错误的。
此外,正如有人在评论中建议的那样,您可以阻止用户多次单击某个按钮。您可以禁用该按钮并添加一个微调器。