在插入数据库之前获取下一个ID

时间:2018-09-15 14:41:28

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

我正在尝试将下一个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; }

2 个答案:

答案 0 :(得分:2)

  

我正在尝试获取下一个ID,然后再插入数据库...

为什么?您没有给我们提供任何有关为什么它可以解决您所遇到的问题(尚未解释)的详细信息。导致我进入..这是XY Problem)

  

也就是说,您正在尝试解决问题X,并且您认为解决方案Y会起作用,但是当您遇到麻烦时,您可以询问Y,而不是询问X。

关于您的问题:

  

任何人都可以帮助我或为我指明正确的方向吗?

是的,不要这样做

出于这个特定原因,几乎所有数据库都支持自动递增的整数值(许多为20年以上)。您没有用标记问题,而是根据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 InterfacesPascalCasing({{1 }}。

答案 1 :(得分:0)

这里有几个问题。首先是

var autoId = data.RMA_History.OrderByDescending(c => c.Id).FirstOrDefault();

CreateRMAVM model = new CreateRMAVM {
    AutoID = autoId.Id +1
  1. 如果autoId返回null会怎样?当然,这只发生在新数据库上,但是仍然如此。
  2. 如果两个用户Jack和Jill都尝试同时使用您的网站会怎样?根据时间的不同,Jack Jill都可能认为下一个ID是相同的数字,例如23,例如,当Jack或Jill在您的位置创建新记录时,无论谁名次,都会失败。表,因为您将拥有重复的ID。

可以使用在全局范围内唯一的GUID作为ID。这样,您无需担心表的初始状态,也不必担心多个用户同时访问您的网站,就可以知道下一个ID是什么。我通常只是采用不同的模式。无需事先知道ID将是什么,我可以使用controller方法创建新行,并在存储成功的情况下将ID返回给我。