控制器操作方法来更新属性并将其添加到数据库

问题描述 投票:0回答:2

在使用实体框架的 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; }
}
c# asp.net asp.net-mvc entity-framework
2个回答
1
投票

您的代码结构存在问题。如果你注意到了,

 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();
}

如有任何疑问,请随时询问。


0
投票
     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");
 }
© www.soinside.com 2019 - 2024. All rights reserved.