更新DbSet<;T>;项目';来自控制器的s值-C#,MVC,代码优先
这里是我的问题:我有一个MVC3 C#应用程序,我需要从编辑控制器更新DbSet中的一个值,因此T项的值将替换为一个新值。我不想删除该项目并再次添加它。我不知道怎么做。DbSet似乎没有类似于索引的东西 这是我的编辑控制器:更新DbSet<;T>;项目';来自控制器的s值-C#,MVC,代码优先,c#,asp.net-mvc,code-first,dbcontext,C#,Asp.net Mvc,Code First,Dbcontext,这里是我的问题:我有一个MVC3 C#应用程序,我需要从编辑控制器更新DbSet中的一个值,因此T项的值将替换为一个新值。我不想删除该项目并再次添加它。我不知道怎么做。DbSet似乎没有类似于索引的东西 这是我的编辑控制器: public class ItemController : Controller { private SESOContext db = new SESOContext(); private FindQrs fqr = new
public class ItemController : Controller
{
private SESOContext db = new SESOContext();
private FindQrs fqr = new FindQrs();
[HttpPost]
public ActionResult Edit(Item item)
{
if (ModelState.IsValid)
{
db.Entry(item).State = EntityState.Modified;
Qr qr = fqr.FindQr(item.QR);
// update somewhere here
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.SetID = new SelectList(db.Sets, "SetID", "Name", item.SetID);
return View(item);
}
}
编辑:上述控制器用于在创建操作时创建Qr实体实例的项目实体。我只想添加一些东西,在编辑操作中将使用视图中的值更新Qr实体的值字段(Qr的值字段应该是唯一的)
其中FindQrs方法如下所示:
public class FindQrs
{
private SESOContext db = new SESOContext();
public Qr FindQr(string qr)
{
List<Qr> qrList = db.Qrs.ToList<Qr>();
Qr foundQr = qrList.Find(delegate(Qr qrDel) { return qrDel.Value == qr; });
return foundQr;
}
}
public DbSet<Qr> Qrs { get; set; }
公共类FindQrs
{
私有SESOContext db=新SESOContext();
公共Qr FindQr(字符串Qr)
{
List qrList=db.Qrs.ToList();
Qr foundQr=qrList.Find(委托(Qr qrDel){return qrDel.Value==Qr;});
返回原始qr;
}
}
Qr是一个只包含ID和字符串值字段的类。
Qrs是上下文中提到的DbSet。看起来是这样的:
public class FindQrs
{
private SESOContext db = new SESOContext();
public Qr FindQr(string qr)
{
List<Qr> qrList = db.Qrs.ToList<Qr>();
Qr foundQr = qrList.Find(delegate(Qr qrDel) { return qrDel.Value == qr; });
return foundQr;
}
}
public DbSet<Qr> Qrs { get; set; }
public DbSet Qrs{get;set;}
任何帮助都将不胜感激。您可能正在另一个数据库上下文中更新该值。试试这个:
[HttpPost]
public ActionResult Edit(Item item)
{
if (ModelState.IsValid)
{
db.Entry(item).State = EntityState.Modified;
Qr qr = fqr.FindQr(item.QR, db);
// update somewhere here
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.SetID = new SelectList(db.Sets, "SetID", "Name", item.SetID);
return View(item);
}
public class FindQrs
{
public Qr FindQr(string qr, SESOContext db) // pass in the db context
{
List<Qr> qrList = db.Qrs.ToList<Qr>();
Qr foundQr = qrList.Find(delegate(Qr qrDel) { return qrDel.Value == qr; });
return foundQr;
}
}
[HttpPost]
公共操作结果编辑(项目)
{
if(ModelState.IsValid)
{
db.Entry(item).State=EntityState.Modified;
Qr=fqr.FindQr(项目Qr,db);
//更新这里的某个地方
db.SaveChanges();
返回操作(“索引”);
}
ViewBag.SetID=新选择列表(db.Sets,“SetID”,“Name”,item.SetID);
返回视图(项目);
}
公共类FindQrs
{
public Qr FindQr(字符串Qr,SESOContext db)//在db上下文中传递
{
List qrList=db.Qrs.ToList();
Qr foundQr=qrList.Find(委托(Qr qrDel){return qrDel.Value==Qr;});
返回原始qr;
}
}
您可能正在不同的数据库上下文中更新该值。试试这个:
[HttpPost]
public ActionResult Edit(Item item)
{
if (ModelState.IsValid)
{
db.Entry(item).State = EntityState.Modified;
Qr qr = fqr.FindQr(item.QR, db);
// update somewhere here
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.SetID = new SelectList(db.Sets, "SetID", "Name", item.SetID);
return View(item);
}
public class FindQrs
{
public Qr FindQr(string qr, SESOContext db) // pass in the db context
{
List<Qr> qrList = db.Qrs.ToList<Qr>();
Qr foundQr = qrList.Find(delegate(Qr qrDel) { return qrDel.Value == qr; });
return foundQr;
}
}
[HttpPost]
公共操作结果编辑(项目)
{
if(ModelState.IsValid)
{
db.Entry(item).State=EntityState.Modified;
Qr=fqr.FindQr(项目Qr,db);
//更新这里的某个地方
db.SaveChanges();
返回操作(“索引”);
}
ViewBag.SetID=新选择列表(db.Sets,“SetID”,“Name”,item.SetID);
返回视图(项目);
}
公共类FindQrs
{
public Qr FindQr(字符串Qr,SESOContext db)//在db上下文中传递
{
List qrList=db.Qrs.ToList();
Qr foundQr=qrList.Find(委托(Qr qrDel){return qrDel.Value==Qr;});
返回原始qr;
}
}
您想更新什么属性或实体?@dtryon-hm您是对的-我没有提到这一点。我想用视图中的新值更新DbSet中Qr项的值(在用户单击例如:在某个视图中保存后),我将编辑我的问题。好的,您应该可以通过设置要在从db上下文中选择的Qr上更新的属性来实现这一点。只要确保在更新和保存时处于相同的数据库上下文中,否则EF无法进行更改跟踪。请看下面我的答案。您想更新什么属性或实体?@dtryon-hm您是对的-我没有提到这一点。我想用视图中的新值更新DbSet中Qr项的值(在用户单击例如:在某个视图中保存后),我将编辑我的问题。好的,您应该可以通过设置要在从db上下文中选择的Qr上更新的属性来实现这一点。只要确保在更新和保存时处于相同的数据库上下文中,否则EF无法进行更改跟踪。请看下面我的答案。好答案。我不得不稍微修改我的代码以避免一些异常,但将DbContext传递给该方法就做到了!非常感谢。非常感谢。:)回答得好。我不得不稍微修改我的代码以避免一些异常,但将DbContext传递给该方法就做到了!非常感谢。非常感谢。:)