从模型更新数据库行
问题描述:
我在使用Linq2Sql更新数据库中的一行时遇到了一些问题。从模型更新数据库行
在我的模型中,我有两种方法可以更新并从控制器中保存,然后从我的视图中接收更新后的模型。
我的模型的方法,如像:
public void Update(Activity activity)
{
_db.Activities.InsertOnSubmit(activity);
}
public void Save()
{
_db.SubmitChanges();
}
,并在我的控制器代码喜欢就好:
[HttpPost]
public ActionResult Edit(Activity activity)
{
if (ModelState.IsValid)
{
UpdateModel<Activity>(activity);
_activitiesModel.Update(activity);
_activitiesModel.Save();
}
return View(activity);
}
我遇到的问题是,这种代码插入一个新进入数据库,即使我在提交时插入的模型项目包含主键字段。
我也尝试将模型对象重新附加回数据源,但由于该项已存在,所以会引发错误。
任何指针正确的方向将不胜感激。
UPDATE:
我使用扶养注射到我的实例化DataContext对象如下:
IMyDataContext _db;
public ActivitiesModel(IMyDataContext db)
{
_db = db;
}
答
我通过在Update方法中重新获取和更新我的对象来修复此问题。
,而不是试图重新连接或获取数据上下文意识到这是属于它之前,我主要做如下相同的对象:
[HttpPost]
public ActionResult Edit(Activity activity)
{
Activity myActivity = activitiesModel.getActivityById(activity.id);
myActivity.name = activity.name;
myActivity.date = activity.date;
_dbContext.SubmitChanges();
return View(activity);
}
这不是我的确切代码和更确切地说,我为我的datacontext创建了另一个部分类,并将更新代码存储在那里。
答
应该有在InsertOnSubmit方法使用的情况下插入,这是一个预期行为。
我们推荐您的Update()方法实现中使用Attach()方法。如果您在实体中有IsVersion列,那么一切都很简单,在另一种情况下,您必须将原始值也传递给Attach呼叫。更多信息可在 here in MSDN。
我可能是完全不正确的,但我会猜测问题在于你的datacontext如何实例化。 – Ahmad 2010-06-01 06:18:32
嗨Ahman。我的数据上下文使用DI实例化。我将用实例化代码更新我的问题。 – 2010-06-01 08:46:09
虽然使用DI,但datacontext,transient,singleton,per-web-request等的生活方式是什么。除非您已指定,否则您选择的DI容器的默认生活方式可能会生效。我正在猜测这里 :) – Ahmad 2010-06-01 09:28:03