温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - How to generate an unique number while saving the data in MVC using Entity Framework as per the max
.net asp.net-mvc c# entity-framework sql-server

c# - 根据最大数量如何在使用 Entity framework 将数据保存在MVC中时生成唯一编号

发布于 2020-04-10 09:07:35

我必须缩短以下代码。

我需要生成和列保存一个唯一的参考号为 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();
       }
   }
}

我将数据保存在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

我想因为我保存文件还需要加以保存在类似的格式,以减少这些代码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()`
     }
   }
}

查看更多

提问者
Suraj Kumar
被浏览
54
Reza Aghaei 2020-02-04 00:05

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

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]))
)

然后,当您使用EF或类似查询插入表中时:

INSERT INTO [dbo].[Table1]([Name]) VALUES (N'Something')

结果是:

| Id   | Name           | Code              |
=============================================
| 1    | Something      | R00001            |

重要的提示

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

  • 使用身份列:*您可以定义身份Id列。然后,yourEnitty在db中插入之后,之后SaveChanges()yourEntity.Id将包含新插入的标识值,并且您不需要对db的其他调用。然后,您可以使用相同的ID作为参考(例如,作为文件名)。

  • 使用Guid列:*您可以定义Guid Id列。然后,在插入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");
}