我有一个像这样的编辑动作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(CompositeModel cm)
{
if (ModelState.IsValid)
{
try
{
db.Entry(cm.model_1).State = EntityState.Modified;
db.SaveChanges();
if (cm.model_2List == null) return View(cm);
foreach (var model in cm.model_2List)
{
var row = ( from s in db.model_2
where s.rid == model.rid
select s).FirstOrDefault();
row = model;
db.Entry(row).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception ex) { log(); }
}
return View(cm);
}
第一个db.SaveChangesa()
将更改保存到数据库,但第二个(在循环中)不保存。 model_2是从没有ID列的数据库表构建的,这就是我通过rid
列查找行的原因(它包含一个唯一的guid,它没有被归类为id列,我不知道如何为列分配uniqueidentifier类型,也许这将解决我的问题。)
我做错了什么?
修改
我已经做了一些测试,似乎问题在于这个表没有主键列。我有一段类似的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(CompositeModel2 cm2)
{
if (ModelState.IsValid)
{
try
{
db.Entry(cm2.Model_3).State = EntityState.Modified;
db.SaveChanges();
if (cm2.Model_4List == null) return View(cm2);
foreach (var model in cm2.Model_4List)
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception ex) { log(); }
}
return View(cm2);
}
按预期工作。
答案 0 :(得分:0)
经过一些工作,我设法通过在数据库上运行sql语句来解决我的问题:
ALTER table [db].[dbo].[table]
ADD id uniqueidentifier PRIMARY KEY NOT NULL DEFAULT NEWID()
GO
这解决了实体在桌子上遇到的问题。