我正在尝试将下一个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; }
答案 0 :(得分:2)
我正在尝试获取下一个ID,然后再插入数据库...
为什么?您没有给我们提供任何有关为什么它可以解决您所遇到的问题(尚未解释)的详细信息。导致我进入..这是XY Problem)。
也就是说,您正在尝试解决问题X,并且您认为解决方案Y会起作用,但是当您遇到麻烦时,您可以询问Y,而不是询问X。
关于您的问题:
任何人都可以帮助我或为我指明正确的方向吗?
是的,不要这样做。
出于这个特定原因,几乎所有数据库都支持自动递增的整数值(许多为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({{1 }}。
答案 1 :(得分:0)
这里有几个问题。首先是
var autoId = data.RMA_History.OrderByDescending(c => c.Id).FirstOrDefault();
CreateRMAVM model = new CreateRMAVM {
AutoID = autoId.Id +1
您可以使用在全局范围内唯一的GUID作为ID。这样,您无需担心表的初始状态,也不必担心多个用户同时访问您的网站,就可以知道下一个ID是什么。我通常只是采用不同的模式。无需事先知道ID将是什么,我可以使用controller方法创建新行,并在存储成功的情况下将ID返回给我。