我在保存对数据库的更改时遇到问题。
我正在控制器中更新模型 A,但是当我使用 SaveChanges() 保存更改时,我最终在 B 的数据库中出现了重复的项目。
调用 UpdateModel() 后,我检查了 Bs 属性,它正如我所预期的那样,但是在调用 SaveChanges() 后,如果我检查 Bs 属性,我将看到 Id 完全不同(新 Id 和新条目)。
我的课程与此类似:
public class A
{
[HiddenInput(DisplayValue = false)]
public int AId { get; set; }
public string Name { get; set; }
public virtual ICollection<B> Bs{ get; set; }
}
public class B
{
[HiddenInput(DisplayValue = false)]
public int BId { get; set; }
public string Name { get; set; }
public virtual ICollection<A> As{ get; set; }
}
我的控制器是这样的:
[HttpPost]
public ActionResult Edit(A theA)
{
try
{
db.Entry(theA).State = EntityState.Modified;
foreach (var item in theA.Bs)
{
db.Entry(item).State = EntityState.Modified;
}
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
难道我做错了什么 ?
提前致谢
这是常见的行为。问题是 EF 不知道您附加了现有的B
所以它会自动插入一条新记录。你必须说 EFB
通过调用以下命令可以找到现有的:
// here add B to the collection in the A and after that call:
dbContext.Entry<B>(someB).State = EntityState.Unchanged();
或通过附加B
在将其添加到集合之前A
(我不确定使用时这是否可行UpdateModel
在 ASP.NET MVC 中)。
dbContext.Bs.Attach(someB);
// now add B to the collection in the A
另一种可能性是加载B
首先从数据库中将加载的对象添加到集合中A
但这是到数据库的额外往返。
int id = someB.Id;
var loadedB = dbCotnext.Bs.Single(b => b.Id == id);
someA.Bs.Add(loadedB);
dbContext.As.Add(someA);
dbContext.SaveChanges();
结论:每次你打电话Add
整个对象图将被跟踪为已插入,除非您首先附加相关实体(在将它们添加到插入的父级之前 - 第二个和第三个示例),或者除非您在添加父级后手动将相关实体的状态更改回不变。 (第一个例子)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)