在使用实体框架的 ASP.NET MVC 应用程序中,我有一个编辑视图,我在其中更新实体模型之一的一些属性。如果用户想要添加该类型的新属性,我想为其中一个属性添加一个“添加”按钮(但不删除旧条目,我知道这需要这些类型的属性的列表)。当我单击此添加按钮时,使用
Ajax.ActionLink
将从部分视图中检索新的 Html.EditorFor
帮助器并将其添加到当前表单。
目前我的 ActionMethod 看起来只是更新已经存在的字段,我可以添加什么样的逻辑来表示“如果这是一个新属性,则 db.Add”?
这就是我现在的方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult TimeSeriesData(List<TimeSeriesData> List1)
{
int empid = List1[0].EmployeeID;
if (ModelState.IsValid)
{
foreach (TimeSeriesData ln in List1)
{
db.Entry(ln).State = EntityState.Modified;
}
db.SaveChanges();
return RedirectToAction("Edit", new { id = empid });
}
return new EmptyResult();
}
我想在 foreach 循环内的某个位置添加逻辑,并说列表中的项目是否是新项目,然后
db.MyModel.List.Add(item);
但我不知道如何检查列表项目是否是新的
会是这样的吗
if (newproperty.propertyid == null) {
db.MyModel.List.Add(newproperty);
}
如果您需要更多说明,请告诉我
编辑
或者问我的问题的另一种方式是:如何检查该项目是否已存在于数据库中,
型号:
//summarized
class Employee {
int EmployeeID {get;set;}
List<TimeSeriesData> TimeSeriesData {get;set;}
}
class TimeSeriesData {
int TimeSeriesDataID {get; set;}
int EmployeeID {get;set;}
string Value {get;set;}
[ForeignKey("EmployeeID")]
public Employee Employee { get; set; }
}
您的代码结构存在问题。如果你注意到了,
db.Entry(ln).State = EntityState.Modified;
您只是更新/编辑该特定实体,而不是添加属性。而且,我认为你有点错过了一些逻辑。
如果要为其添加另一个属性,则应该将其放在单独的表中,并将其引用到父表的主键。通过这种方式,您将不会有任何问题添加另一个值。
要回答你的第二个问题,你可以使用上下文的
.Any
属性来检查数据库中是否存在该项目。你可以有这样的东西:
var db = new Context();
if(!db.mytable.Any(m => m.field == value)){
db.mytable.Add(value);
db.SaveChanges();
}
如有任何疑问,请随时询问。
public async Task<IActionResult> Update(int? id)
{
if (id == null) return BadRequest();
var data = await _db.Sliders.FindAsync(id);
if (data == null) return NotFound();
return View(new SliderUpdateVm
{
ImageUrl = data.ImageUrl,
Profession = data.Profession,
Instructor = data.Instructor,
});
}
[HttpPost]
public async Task<IActionResult>Update(int? id,SliderUpdateVm vm)
{
if (id == null) return BadRequest();
if (!ModelState.IsValid)
{
return View(vm);
}
var data = await _db.Sliders.FindAsync(id);
if (data == null) return NotFound();
data.Instructor = vm.Instructor;
data.Profession = vm.Profession;
string filepath = Path.Combine(_environment.WebRootPath, "Assets", "images", "stories", data.ImageUrl);
if (System.IO.File.Exists(filepath))
{
System.IO.File.Delete(filepath);
}
string filename = Guid.NewGuid() + Path.GetExtension(vm.FileImage.FileName);
using (Stream fs = new FileStream(Path.Combine(_environment.WebRootPath, "Assets", "images", "stories", filename), FileMode.Create))
{
await vm.FileImage.CopyToAsync(fs);
}
data.ImageUrl = filename;
await _db.SaveChangesAsync();
return RedirectToAction("Index");
}