Sur*_*mar 4 .net c# sql-server asp.net-mvc entity-framework
我必须缩短以下代码。
我需要生成和列保存一个唯一的参考号为 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();
}
}
}
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.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()`
}
}
}
Run Code Online (Sandbox Code Playgroud)
作为一个选项,您可以创建一个标识列和一个计算列,在计算列中,根据标识列计算所需的值。例如:
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 作为参考(例如作为文件名)。
考虑以下几点:
我的建议是使用密钥(如 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)
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |