Asp.net mvc 将ASP.NET和MVC LINQ中的一行更新为SQL

Asp.net mvc 将ASP.NET和MVC LINQ中的一行更新为SQL,asp.net-mvc,linq-to-sql,Asp.net Mvc,Linq To Sql,我有一个简单的行,它有4列: { [Primary Key Int]RowID, [text]Title, [text]Text, [datetime]Date } 我想允许用户在一个简单的页面上编辑这一行,该页面有一个带有“Title”和“Text”字段的表单 有一个隐藏字段用于存储RowID 当用户将此表单发布到我的控制器操作时,我希望它更新行的标题和文本,并保持日期不变。我不想在表单页面中明确包含日期的隐藏字段 以下是我的行动: [AcceptVerbs(HttpVerb.Post)]

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

{ [Primary Key Int]RowID, [text]Title, [text]Text, [datetime]Date }
我想允许用户在一个简单的页面上编辑这一行,该页面有一个带有“Title”和“Text”字段的表单

有一个隐藏字段用于存储RowID

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

以下是我的行动:

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

public void SaveRow(Row myRow)
{
    db.MyRows.Attach(myRow);
    db.Refresh(RefreshMode.KeepCurrentValues, myRow);
    db.SubmitChanges();
}
这不会在行中保留“Date”值,并尝试插入引发timespan异常的值

我怎么能告诉它保持旧的价值观呢?
我尝试了刷新模式。KeepChanges什么都没有。

我目前无法测试这一点,但请尝试使datetime列为空,然后确保传递到SaveRow的datetime具有空值。

尝试

[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”所做的更改。

好的,我将其设置为nullable,它将继续以null值覆盖数据库。我想这是不可能的,因为从技术上讲null是列的有效值,如果我将对象传递给函数,空值必须包含某些内容或为null

因此,我必须显式声明以获取该列的数据库值


谢谢

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

类表实现了“INotifyPropertyChanging | ed”,用于跟踪已更改的列

您可以破解它并重置值“this.PropertyChanged”

但我在工作中使用的是一种愚蠢的读写方法(我使用的是网络表单)

你可以做得简单一点

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

另外,我是LINQtoSQL的新手。如果有更聪明的方法,请告诉我。

嗯。。。您是对的,似乎1/1/0001 12:00:00 AM的值被传递到了Row.Date,如果它没有给定值的话。如果我将Linq to SQL中的“Date”列设置为可空,则每次需要使用它时,我都需要将其引用为myRow.Date.Value是否正确?是的,但可以使用nullreferenceexceptions。因此,在通过if(myRow.Data.HasValue)引用它之前,首先检查一下。它仍然会传递一个空值。查看代码,它只会从datacontext中提取行,然后提交更改,而不会实际执行任何更改。我知道我可以手动从datacontext中提取行,然后获取发布的“文本”和“标题”字段,更改该行的值,然后调用submitchanges,但我希望模型绑定来完成这项工作。UpdateModel(myRow)会自动为您执行模型绑定。它将使页面上的字段与行对象的属性相匹配。如果您的行是通过DataContext.Rows.Select()调用的Linq to SQL对象(或等效对象),则DataContext.SubmitChanges()将保存对该行对象所做的任何更改。如果您还没有,请查看MVC.Net Nerd免费电子书。不,很可能,您只需要尝试不同的方法。Linq to Sql将只保存更新的值。请参阅“尝试我的更新答案”。检查我对您的答案的评论。
public void SaveRow(Row myRow)
{
    db.MyRows.Attach(new Row(){
        Id=myRow.Id,
        Title=myRow.Title,
        Text=myRow.Text,
    });
    db.SubmitChanges();
}