在插入数据库之前获取下一个ID [关闭]

问题描述 投票:-4回答:2

我正在尝试在插入数据库之前获取下一个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; }
c# asp.net-mvc entity-framework
2个回答
2
投票

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

为什么?您没有详细说明为什么这可以解决您遇到的问题(您尚未解释)。这让我进入..这是一个XY Problem)

也就是说,你正试图解决问题X,并且你认为解决方案Y会起作用,但是当你遇到麻烦时,不要问X,你会问Y.

在您的问题上:

有谁可以帮助我或指出我正确的方向?

是的,不要这样做。

由于这个特定原因,几乎所有数据库都支持自动增量整数值(许多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)的RMAHistory


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将是什么,我有控制器方法创建新行并在商店成功时将该ID返回给我。

© www.soinside.com 2019 - 2024. All rights reserved.