首页 > 解决方案 > 控制器根据模型变量删除表中的行

问题描述

我有一个 HttpPost 控制器,它将学校模型预订添加到学校数据库中(它保存了学校名称、学校日期、学校 ID 等信息)。现在我需要删除 Dates Db 中与刚刚输入 School Db 的日期相同的行,例如,如果输入的 School 模型日期是 13/07/2019,我想在 Dates Db 中找到具有日期的行- 13/07/2019 然后从表中删除这一行

到目前为止我的控制器:

[HttpPost]
    public ActionResult Booking(School model)
    {
        db.Schools.Add(model);
        db.SaveChanges();


        //make chosen school date unavailable in datepicker
        Datepicker date = db.Dates.Find(model.Date); 
        db.Dates.Remove(date);
        db.SaveChanges();

        return RedirectToAction("Booking");
    }

学校模型(Schools Db 上下文):

namespace BookingSys.Models
{
  public class School
  {
    public DateTime Date { get; set; }
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int PhoneNumber { get; set; }
  }
} 

DatePicker 模型(日期 Db 上下文):

namespace BookingSys.Models
{
  public class Datepicker
  {
    public DateTime Date { get; set; }
    public int Id { get; set; }
    public int LecturerId { get; set; }
    public string Comment { get; set; }
  }
}

当我在视图中单击提交以创建学校模型时,我目前收到以下错误:

System.ArgumentException: '主键值之一的类型与实体中定义的类型不匹配。有关详细信息,请参阅内部异常。参数名称:keyValues EntitySqlException:参数类型“Edm.Int32”和“Edm.DateTime”不兼容此操作。在 WHERE 谓词附近,第 1 行,第 62 列。

一只忙碌的猫

提前致谢

标签: c#asp.netasp.net-mvclinq

解决方案


你需要的是 lamda 表达式,也可以使用FirstorFirstOrDefault

更改此行

Datepicker date = db.Dates.Find(model.Date); 

Datepicker date = db.Dates.First(m => m.Date == model.Date); 

或者

//if you are not sure if the date exists in both tables
Datepicker date = db.Dates.FirstOrDefault(m => m.Date == model.Date); 
// then check for null before deleting

Find()需要表的主键的值并且需要获取databay Date


推荐阅读