我正在尝试在插入数据库之前获取下一个ID,我做了如下,它工作正常。当我导航到页面时,我可以看到下一个ID,但是如果有两个用户同时来到并尝试创建新记录,那么无论谁进入第二个,都会失败。如何以正确的方式存档?
任何人都可以帮助我或指出我正确的方向?
控制器:
得到:
[HttpGet]
public ActionResult OpretRMA ()
{
var autoId = data.RMA_History.OrderByDescending(c => c.Id).FirstOrDefault();
CreateRMAVM model = new CreateRMAVM {
AutoID = autoId.Id +1
};
return View(model);
}
帖子:
[HttpPost]
public JsonResult ProcessCreateRMA(CreateRMAVM model)
{
var RMA = new RMA_History
{
Kundenummer = model.Kundenummer
};
db.RMA_History.Add(RMA);
db.SaveChanges();
return Json(model, JsonRequestBehavior.AllowGet);
}
查看型号:
public class CreateRMAVM
{
public string Kundenummer { get; set; }
public int AutoID { get; set; }
}
模型:
public string Kundenummer { get; set; }
[Key]
public int Id{ get; set; }
我想在插入数据库之前获取下一个ID ...
为什么?您没有详细说明为什么这可以解决您遇到的问题(您尚未解释)。这让我进入..这是一个XY Problem)。
也就是说,你正试图解决问题X,并且你认为解决方案Y会起作用,但是当你遇到麻烦时,不要问X,你会问Y.
在您的问题上:
有谁可以帮助我或指出我正确的方向?
是的,不要这样做。
由于这个特定原因,几乎所有数据库都支持自动增量整数值(许多20年+)。您没有使用entity-framework标记您的问题,但基于SaveChanges()我为您标记了它。我的答案重置将基于该假设。您的Id不仅应该是一个密钥,而且应该是数据库中的Identity Column(假设Microsoft Sql Server),您应该将DatabaseGeneratedAttribute()添加到您的模型中:
public string Kundenummer { get; set; }
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id{ get; set; }
没有理由为什么任何客户端需要知道下一个Id值(特别是当它不可能在任何时间点都知道值是正确的时)。所以没有理由查找它并将其发送给客户端(html)。
[HttpGet]
public ActionResult OpretRMA ()
{
CreateRMAVM model = new CreateRMAVM()
return View(model);
}
此外,在插入数据库时甚至不使用它。唯一真正的问题可能是,如何确定新插入行的值。好吧,如果你使用的是实体框架,它会为你做到这一点。
[HttpPost]
public JsonResult ProcessCreateRMA(CreateRMAVM model)
{
var RMA = new RMAHistory
{
Kundenummer = model.Kundenummer
};
// Returns 0
System.Diagnostics.Debug.WriteLine("{RMA.Id}");
db.RMA_History.Add(RMA);
db.SaveChanges();
// Returns the value of the row saved in the Db
// Because EF models should represent in the value in Db
// So EF will populate it automatically
System.Diagnostics.Debug.WriteLine("{RMA.Id}");
return Json(model, JsonRequestBehavior.AllowGet);
}
我还建议你不要在你的班级名称中使用下划线(RMA_History
),而是使用推荐Microsoft Framework Design Guidelines - Names of Classes Structs and Interfaces(PascalCasing)的RMAHistory
。
这里有几个问题。首先是
var autoId = data.RMA_History.OrderByDescending(c => c.Id).FirstOrDefault();
CreateRMAVM model = new CreateRMAVM {
AutoID = autoId.Id +1
您可以使用全局唯一的GUID作为ID。通过这种方式,您可以知道您的下一个ID是什么,而不必担心您的桌子的初始状况,或者同时有多个用户访问您的网站。我通常只是采用不同的模式。我不需要提前知道ID将是什么,我有控制器方法创建新行并在商店成功时将该ID返回给我。