C# 在asp mvc的编辑方法中将新实体添加到列表属性
我有一个有子实体列表的实体 在编辑模式下,我需要向列表中添加一些子实体。 但我在运行时遇到了这个错误: 附加“ResturanCmsAdmin.Models.Image”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改” 我的实体和编辑代码如下所示C# 在asp mvc的编辑方法中将新实体添加到列表属性,c#,asp.net-mvc,entity-framework,model-view-controller,C#,Asp.net Mvc,Entity Framework,Model View Controller,我有一个有子实体列表的实体 在编辑模式下,我需要向列表中添加一些子实体。 但我在运行时遇到了这个错误: 附加“ResturanCmsAdmin.Models.Image”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需
public partial class Image
{
public Image()
{
this.News = new HashSet<News>();
}
public int ID { get; set; }
public string Text { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<News> News { get; set; }
}
我认为问题是因为您试图从导航属性检索实体ˋNews'。你需要一个查询,比如vvar item =db.图像。包含(n=> n.New)。考虑使用Add方法,而不是改变状态。此外,您还可以在不收集新闻的情况下更新图像实体,然后对每个新闻项进行迭代。正如错误消息所示,问题似乎出在图像实体上。最可能的问题是您尝试跟踪的映像实例已被您的db实例跟踪。你能提供更多关于如何在这个方法中传递db实例的信息吗?谢谢大家的回答。我通过视图模型解决它,并通过代码添加新的子实体。
public ActionResult Edit( Image image)
{
if (ModelState.IsValid)
{
foreach (var item in image.News)
{
item.ImageID = image.ID;
if (item.ID == 0)
db.Entry(item).State = EntityState.Added;
else
db.Entry(item).State = EntityState.Modified;
}
db.Entry(image).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(image);
}