代码之家  ›  专栏  ›  技术社区  ›  Omar

将ASP.NET和MVC LINQ中的行更新为SQL

  •  2
  • Omar  · 技术社区  · 15 年前

    我有一个简单的行,它有4列:

    { [Primary Key Int]RowID, [text]Title, [text]Text, [datetime]Date }
    

    我想允许用户在一个简单的页面上编辑此行,该页面有一个带有字段“标题”和“文本”的表单。

    有一个隐藏字段来存储rowid。

    当用户将此表单发布到我的控制器操作时,我希望它更新行的标题和文本,并保持日期不变。我不想在表单页面中显式包含日期的隐藏字段。

    以下是我的行动:

    [AcceptVerbs(HttpVerb.Post)]
    public ActionResult EditRow(Row myRow)
    {
        RowRepository.SaveRow(myRow)   
        return View("Success");
    }
    

    RowRepository:

    public void SaveRow(Row myRow)
    {
        db.MyRows.Attach(myRow);
        db.Refresh(RefreshMode.KeepCurrentValues, myRow);
        db.SubmitChanges();
    }
    

    此操作不会将“日期”值保留在行中,并尝试插入引发TimeSpan异常的值。

    我怎样才能让它保持原有的价值观呢? 我试着做 RefreshMode.KeepChanges 什么也没有。

    4 回复  |  直到 13 年前
        1
  •  2
  •   Lazarus    15 年前

    我现在还不能测试这个问题,但是请尝试使datetime列可以为空,然后确保传递到saverow的datetime的值为空。

        2
  •  1
  •   David Glenn    15 年前

    尝试

    [AcceptVerbs(HttpVerb.Post)]
    public ActionResult EditRow([Bind(Exclude="Date")] Row myRow) {
      RowRepository.SaveRow(myRow)   
      return View("Success");
    }
    

    更新

    尝试这种方法,在您的页面上没有“日期”字段

    [AcceptVerbs(HttpVerb.Post)]
    public ActionResult EditRow(int RowID) {
      Row myRow = RowRepository.GetRow(RowID);
      UpdateModel(myRow);
      RowRepository.Save();
      return View("Success");
    }
    

    在您的存储库中

    public void Save() {
      db.SubmitChanges();
    }
    

    这将只保存对“myrow”所做的更改

        3
  •  0
  •   Peter Mortensen John Conde    13 年前

    您将在分部类中添加一个方法/重写它生成的代码。

    类表确实实现了“inotifypropertychanging_ed”,用于跟踪已更改的列。

    您可以对其进行黑客攻击并重置值“this.propertychanged”。

    但我在工作中所做的是一种愚蠢的读写方法(我使用的是WebForm)。

    public void SaveRow(Row myRow)
    {
        var obj=db.MyRows.Where(c=>c.id==myRow.id).First();
        obj.a=myRow.a;
        obj.b=myRow.b;
        db.SubmitChanges();
    }
    

    你可以做得简单一点。

    public void SaveRow(Row myRow)
    {
        db.MyRows.Attach(new Row(){
            Id=myRow.Id,
            Title=myRow.Title,
            Text=myRow.Text,
        });
        db.SubmitChanges();
    }
    

    另外,我刚接触Linq to SQL。如果有更聪明的方法,请告诉我。

        4
  •  -1
  •   Omar    15 年前

    好的,我把它设置为nullable,它会不断地将数据库重写为一个空值。我想这是不可能的,因为从技术上讲,空值是列的有效值,如果我将对象传递给函数,则空值必须包含某些内容或为空。

    所以我必须显式地声明为该列获取数据库值

    谢谢