如何根据表的最大标识键使用实体框架在MVC中保存数据时生成唯一编号?

Sur*_*mar 4 .net c# sql-server asp.net-mvc entity-framework

我必须缩短以下代码。

我需要生成和列保存一个唯一的参考号为 R00001R00002R00003等。这里1,2和3是基于身份密钥值。

为此,我写了db.SaveChanges()两次。首先我保存数据并选择保存的数据并通过生成该唯一键来更新它。是否可以在一次保存的同时生成该密钥并传递?

因此,我不需要通过再次调用db.SaveChanges()两次来保存和更新数据后选择数据。这是我的 MVC 控制器(MVC 操作)代码。

[HttpPost]
public ActionResult Create(RateTable model, HttpPostedFileBase[] files)
{
  RateTable objRC = null;
  if (model.RatecontractId >= 1)
  {
      objRC = db.RateTables.FirstOrDefault(rc => rc.RatecontractId == model.RatecontractId);
  }

  if (objRC == null && model.RatecontractId <= 0)
  {
      objRC = new RateTable();

      objRC.CountryCode = model.CountryCode;
      objRC.CompanyCode = model.CompanyCode;
      objRC.CustomerName = model.CustomerName;
      objRC.Remarks = model.Remarks;
      objRC.CreatedDate = DateTime.Now;
      objRC.CreatedBy = User.Identity.Name;

      //Saving data into the database table.
      db.RateTables.Add(objRC);
      db.SaveChanges();

      string uniqueRefNo = "R" + string.Format("{0:D5}", objRC.RatecontractId); 
      int rateContractId = objRC.RatecontractId;

      //For updating the unique reference number of the contract.
      RateTable result = (from rc in db.RateTables where rc.RatecontractId == rateContractId select rc).SingleOrDefault();
       if (result != null)
       {
          result.UniqueRefNo = uniqueRefNo;
          db.SaveChanges();
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

我将数据保存在UniqueRefNo列中,如下所示:

RatecontractId  CountryCd   CompanyCd   UniqueRefNo
---------------------------------------------------
1               C0U001      C0M001      R00001
2               C0U001      C0M001      R00002
3               C0U001      C0M001      R00003
4               C0U001      C0M001      R00004
5               C0U001      C0M001      R00005
Run Code Online (Sandbox Code Playgroud)

我想因为我保存文件还需要加以保存在类似的格式,以减少这些代码R00001.pdfR00002.pdfR00003.pdf,等。

这是根据唯一参考号重命名文件名的文件保存代码。

if (files != null)
{
  foreach (HttpPostedFileBase file in files)
  {
    if (file != null)
    {
      //To generate the file name of the rate contract.
      var fileName = "RC" + string.Format("{0:D5}", objRC.RatecontractId);
      var extension = Path.GetExtension(file.FileName);
      fileName = fileName + extension;

      string path = string.Format("~/Documents/PDF/{0}", fileName);

       if (System.IO.File.Exists(Server.MapPath(path)))
          System.IO.File.Delete(Server.MapPath(path));
       file.SaveAs(Server.MapPath(path));

       RateTable resultForfiles = (from rc in dbTender.RateTables where 
       rc.RatecontractId == objRC.RatecontractId select rc).SingleOrDefault();
       if (resultForfiles != null && (extension.ToLower() == "pdf" || extension.ToLower() == ".pdf"))
       {
          resultForfiles.PdfFilePath = fileName;
       }
       if (resultForfiles != null && extension.ToLower() != "pdf" && extension.ToLower() != ".pdf")
       {
          resultForfiles.WordExcelFilePath = fileName;
       }
       dbTender.SaveChanges(); //Third thime calling `SaveChanges()`
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 5

作为一个选项,您可以创建一个标识列和一个计算列,在计算列中,根据标识列计算所需的值。例如:

CREATE TABLE [dbo].[Table1](
    [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] NVARCHAR(50) NOT NULL,
    [Code]  AS (('R'+ REPLICATE('0',(5) - LEN(CONVERT([NVARCHAR](50),[Id])))) +
        CONVERT([NVARCHAR](50),[Id]))
)
Run Code Online (Sandbox Code Playgroud)

然后,当您使用 EF 或这样的查询插入表时:

INSERT INTO [dbo].[Table1]([Name]) VALUES (N'Something')
Run Code Online (Sandbox Code Playgroud)

结果是:

| Id   | Name           | Code              |
.............................................
| 1    | Something      | R00001            |
Run Code Online (Sandbox Code Playgroud)

重要的提示

在选择任何解决方案之前,无论是计算列、序列还是触发器,请确保您需要将此类计算代码存储在数据库中。我认为您不需要在数据库端生成和存储参考代码,在需要逻辑或物理关系的地方使用实体的键作为参考号/外键就足够了。

使用标识列:您可以定义标识Id列。然后插入后yourEnitty以dB为单位,之后SaveChanges()yourEntity.Id将包含新插入的标识值,你不需要数据库,再调用。然后您可以使用相同的 id 作为参考(例如作为文件名)。

使用 Guid 列:您可以定义 GuidId列。然后在插入yourEnittydb之前分配Guid.NewId()Id列,然后您可以使用相同的 guid 作为参考(例如作为文件名)。

考虑以下几点:

  • 存储中文件的名称或键以及数据库中实体的键是您的领土,最终用户与此无关。
  • 您可能希望使用 Azure Blob、SQL 数据库、文件系统等存储,并且在任何这些存储技术中,您可以为文件使用不同的键/名称。
  • 最终用户唯一可以说的是,“我想查看带有友好名称的文件链接”或“我想在下载文件时使用友好名称”,这对您来说非常容易在网格中或下载时提供这样的友好名称。

我的建议是使用密钥(如 guid 密钥)存储和检索文件。然后在您的下载操作中,您可以轻松地发送具有不同名称的文件进行下载,例如:

public ActionResult Download(Guid id)
{
    var file = Server.MapPath($"~/Content/uploads/{id}.pdf";
    return File(file, "application/pdf", "something.pdf");
}
Run Code Online (Sandbox Code Playgroud)