保存并编辑到DataBase(实体框架)

时间:2016-07-22 05:16:48

标签: c# asp.net-mvc database entity-framework

我有按钮,按下时 - 控制器动作应该为我的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不好,任何帮助都会很棒 - 好书,代码,文章或建议。 谢谢!

1 个答案:

答案 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();
        }
    }
}
  

我收到了锁定这段代码的建议,但我认为这是错误的。

这是错误的。

正如有人在评论中建议的那样,您可以阻止用户多次点击按钮。您可以禁用该按钮并添加微调器。