【发布时间】:2017-08-15 13:25:51
【问题描述】:
我的问题很简单,我有一个页面,管理员可以在其中管理授权管理员列表,但我的问题是数据库中应该始终至少有 1 个管理员,所以我写了这个简单的if 来检查删除前数据库中的管理员数量应大于 1
这是我的控制器删除操作
public ActionResult DeleteAdmin(int idAdmin)
{
using (InscriptionFormationEntities dbm = new InscriptionFormationEntities())
{
Administrateurs admin = dbm.Administrateurs.FirstOrDefault(x => x.id == idAdmin);
if(admin.NomLogin == Session["utilisateur"].ToString())
{
ModelState.AddModelError("Current User", "You can't delete Yourself");
}
if(dbm.Administrateurs.ToList().Count <= 1)
{
ModelState.AddModelError("LastAdmin", "At least 1 admin must be left");
}
if (ModelState.IsValid)
{
dbm.Administrateurs.Remove(admin);
dbm.SaveChanges();
}
List<Administrateurs> ListeAdmin = dbm.Administrateurs.ToList();
return RedirectToAction("Utilisateurs", "Admin");
}
}
此代码在一种情况下工作得非常好:如果剩下 2 个管理员并且他们尝试同时删除彼此,他们将能够这样做。我试图改变我放置条件的位置(例如在删除之前),但条件仍然总是返回 false。所以我想知道是否有办法防止这种情况发生,比如定义一次只能删除一个实例或类似的东西。
编辑
我调查了这个问题: How can I lock a table on read, using Entity Framework?
但这并不能解决我的问题,因为我不想锁定读取,而是锁定删除,因为如果我锁定只读 1 人一次将能够访问该页面(它可以在更糟糕的情况下工作,但我希望有更好的解决方案)
【问题讨论】:
-
您只需要在删除过程中锁定 - 以检查计数和删除。所有其他时间表将不会被锁定。
-
@VitaliySmolyakov 我知道,但怎么做是我的问题
标签: c# asp.net-mvc entity-framework asp.net-mvc-5