EF Core & ASP.NET Core MVC 添加新数据而不是更新
EF Core & ASP.NET Core MVC add new data instead update
我正在尝试更新一些内容,而我的代码只是添加新行而不是更新数据。我已经在 startup.cs 中使用 addscoped。 (以前的回答都是关于这个的。)
我正在使用存储库模式。
对于我之前的回答;当然,我有数据库和我需要的所有部件。我正在做插入,删除没有问题。
这是我的实体:
public class Product : IEntity
{
public int Id { get; set; }
[Required(ErrorMessage ="Name can not be empty.")]
[MinLength(3,ErrorMessage ="Lenght must be at least 3 characters.")]
public string Name { get; set; }
[DataType(DataType.Currency)]
public double Price { get; set; }
public double? Discount { get; set; }
public string Description { get; set; }
public DateTime? CreatedTime { get; set; }
public DateTime? ModifiedDate { get; set; }
[DisplayName("Image URL")]
public string ImageUrl { get; set; }
public bool IsActive { get; set; } = true;
public Team Team { get; set; }
public int? TeamId { get; set; }
public Category Category { get; set; }
public int CategoryId { get; set; }
}
这是我的回购协议。更新:
public async Task<int> Update(Product entity)
{
entity.ModifiedDate = DateTime.Now;
dbContext.Update(entity);
return await dbContext.SaveChangesAsync();
}
这是控制器:视图的 DD 方法。在下拉菜单中显示 category/team 个名称而不是他们的 ID。
[HttpPost]
public async Task<IActionResult> Edit(ProductUpdateRequest productToUpdate)
{
if (ModelState.IsValid)
{
int affectedRows= await productService.UpdateProduct(productToUpdate);
if (affectedRows>0)
{
TempData["RowAlert"] = "Edit successfully performed.";
}
return View();
}
TempData["RowAlert"] = "Your entries are not acceptable. Check your properties.";
List<SelectListItem> selectedCategories = new List<SelectListItem>();
selectedCategories = await getCategoriesforDD();
List<SelectListItem> selectedTeams = new List<SelectListItem>();
selectedTeams = await getTeamsforDD();
ViewBag.Categories = selectedCategories;
ViewBag.Teams = selectedTeams;
return View();
}
根据您之前的评论,这应该有效:
public async Task<int> Add(Product entity)
{
context.Entry(entity).State = EntityState.Added;
return await dbContext.SaveChangesAsync();
}
更多信息在这里:https://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state
我通过向我的 DTO 添加 ID 解决了这个问题。 (实体的主键。)
public class ProductUpdateRequest
{
public int Id { get; set; }
[Required(ErrorMessage = "Ürün adı boş bırakılamaz.")]
public string Name { get; set; }
[DataType(DataType.Currency)]
public double Price { get; set; }
public double? Discount { get; set; }
public bool IsActive { get; set; }
public string ImageUrl { get; set; }
public string Description { get; set; }
public int? TeamId { get; set; }
public int CategoryId { get; set; }
}
我正在尝试更新一些内容,而我的代码只是添加新行而不是更新数据。我已经在 startup.cs 中使用 addscoped。 (以前的回答都是关于这个的。) 我正在使用存储库模式。 对于我之前的回答;当然,我有数据库和我需要的所有部件。我正在做插入,删除没有问题。
这是我的实体:
public class Product : IEntity
{
public int Id { get; set; }
[Required(ErrorMessage ="Name can not be empty.")]
[MinLength(3,ErrorMessage ="Lenght must be at least 3 characters.")]
public string Name { get; set; }
[DataType(DataType.Currency)]
public double Price { get; set; }
public double? Discount { get; set; }
public string Description { get; set; }
public DateTime? CreatedTime { get; set; }
public DateTime? ModifiedDate { get; set; }
[DisplayName("Image URL")]
public string ImageUrl { get; set; }
public bool IsActive { get; set; } = true;
public Team Team { get; set; }
public int? TeamId { get; set; }
public Category Category { get; set; }
public int CategoryId { get; set; }
}
这是我的回购协议。更新:
public async Task<int> Update(Product entity)
{
entity.ModifiedDate = DateTime.Now;
dbContext.Update(entity);
return await dbContext.SaveChangesAsync();
}
这是控制器:视图的 DD 方法。在下拉菜单中显示 category/team 个名称而不是他们的 ID。
[HttpPost]
public async Task<IActionResult> Edit(ProductUpdateRequest productToUpdate)
{
if (ModelState.IsValid)
{
int affectedRows= await productService.UpdateProduct(productToUpdate);
if (affectedRows>0)
{
TempData["RowAlert"] = "Edit successfully performed.";
}
return View();
}
TempData["RowAlert"] = "Your entries are not acceptable. Check your properties.";
List<SelectListItem> selectedCategories = new List<SelectListItem>();
selectedCategories = await getCategoriesforDD();
List<SelectListItem> selectedTeams = new List<SelectListItem>();
selectedTeams = await getTeamsforDD();
ViewBag.Categories = selectedCategories;
ViewBag.Teams = selectedTeams;
return View();
}
根据您之前的评论,这应该有效:
public async Task<int> Add(Product entity)
{
context.Entry(entity).State = EntityState.Added;
return await dbContext.SaveChangesAsync();
}
更多信息在这里:https://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state
我通过向我的 DTO 添加 ID 解决了这个问题。 (实体的主键。)
public class ProductUpdateRequest
{
public int Id { get; set; }
[Required(ErrorMessage = "Ürün adı boş bırakılamaz.")]
public string Name { get; set; }
[DataType(DataType.Currency)]
public double Price { get; set; }
public double? Discount { get; set; }
public bool IsActive { get; set; }
public string ImageUrl { get; set; }
public string Description { get; set; }
public int? TeamId { get; set; }
public int CategoryId { get; set; }
}