我正在努力使用ASP.NET Core将文件加载到数据库中。我能做错什么?
这就是我的模型中的内容
namespace BeeshoekCWPortal.Models
{
public class CWRecords
{
public int Id { get; set; }
public string RecordName { get; set; }
public byte[] Document { get; set; }
[DisplayFormat(DataFormatString ="{0:d}")]
public DateTime DateAdded { get; set; }
public int CWId { get; set; }
[ForeignKey("CWId")]
public virtual ContingentWorker CW { get; set; }
}
}
这就是我在My ViewModel中所拥有的
namespace BeeshoekCWPortal.ViewModel
{
public class CWandRecordsViewModel
{
public int CWId { get; set; }
public string Title { get; set; }
public string FullNames { get; set; }
public string Surname { get; set; }
public string DateofBirth { get; set; }
public string IdPassportNumber { get; set; }
public string Gender { get; set; }
public string Race { get; set; }
public string Nationality { get; set; }
public IFormFile Document { get; set; }
public CWRecords NewRecordObj { get; set; }
public IEnumerable<CWRecords> PastRecordObj { get; set; }
}
}
我强烈相信我在控制器中做错了什么。
//POST : Services/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(CWandRecordsViewModel model)
{
if (ModelState.IsValid)
{
{
model.NewRecordObj.CWId = model.CWId;
model.NewRecordObj.DateAdded = DateTime.Now;
_db.Add(model.NewRecordObj);
await _db.SaveChangesAsync();
};
using (var memoryStream = new MemoryStream())
{
await model.Document.CopyToAsync(memoryStream);
};
return RedirectToAction(nameof(Create), new { CWId = model.CWId });
}
var CW = _db.ContingentWorkers.FirstOrDefault(c => c.Id == model.CWId);
var newModel = new CWandRecordsViewModel
{
CWId = CW.Id,
Title = CW.Title,
FullNames = CW.FullNames,
Surname = CW.Surname,
DateofBirth = CW.DateofBirth,
IdPassportNumber = CW.IdPassportNumber,
Gender = CW.Gender,
Race = CW.Race,
Nationality = CW.Nationality,
PastRecordObj = _db.CWRecords.Where(r => r.CWId == model.CWId).OrderByDescending(r => r.DateAdded).Take(5)
};
return View(newModel);
}
如何修复控制器,以便我可以将文件上传到数据库。
首先,您不应该在视图模型中创建要作为属性创建的新实体。您应该将它们分开,并且只在实际创建实体时创建实体。
然后,为了存储上载文件中的数据,您必须将其存储在实体中。现在,您所做的只是将数据从上传的文件复制到内存流中。然后您丢弃内存流,因此所有数据都将丢失并且永远不会到达实体或数据库(在您读取文件之前也会保存数据库更改)。
您的代码应如下所示:
if (ModelState.IsValid)
{
var newRecordObj = new CWRecords
{
CWId = model.CWId,
DateAdded = DateTime.Now,
};
using (var memoryStream = new MemoryStream())
{
await model.Document.CopyToAsync(memoryStream);
newRecordObj.Document = memoryStream.ToArray();
};
_db.Add(newRecordObj);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Create), new { CWId = model.CWId });
}