我必须缩短以下代码。
我需要生成和列保存一个唯一的参考号为 R00001
,R00002
,R00003
等。这里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.pdf
,R00002.pdf
,R00003.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()`
}
}
}
作为一种选择,您可以创建一个标识列和一个计算列,在计算列中,根据标识列计算所需的值。例如:
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
列。然后,在插入yourEnitty
db 之前,将其分配Guid.NewId()
给该Id
列,然后可以使用相同的guid作为参考(例如,作为文件名)。
请考虑以下几点:
我的建议是使用诸如guid键之类的键来存储和检索文件。然后,在下载操作中,您可以轻松地发送具有不同名称的文件进行下载,例如:
public ActionResult Download(Guid id)
{
var file = Server.MapPath($"~/Content/uploads/{id}.pdf";
return File(file, "application/pdf", "something.pdf");
}
尽管要获取数据库表的身份键值,但我需要在EF中的SaveChanges()之后进行第二次调用。除此之外,这是我要求的替代方案。
假设您有一个
myEntity
变量并保存该变量:db.MyEntities.Add(myEntity); db.SaveChanges();
那么在没有对db的任何其他请求的情况下,myEntity.Id
将包含您实体插入的标识。无论如何,您会更好地了解自己的要求:)