【问题标题】:asp.net MVC 4 - Many to Many data not updating - Updating Entity Framework with ViewModel Edit Viewasp.net MVC 4 - 多对多数据未更新 - 使用 ViewModel 编辑视图更新实体框架
【发布时间】:2013-05-31 21:00:04
【问题描述】:

asp.net mvc 4、实体框架 5、SQL Server 2012 Express

我有一个 Place 模型:

public virtual int PlaceID { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
public virtual string Name { get; set; }

以及相关的Tag模型:

public virtual int TagID { get; set; }
public virtual string Name { get; set; }
public virtual string NamePlural { get; set; }
public virtual ICollection<Place> Places { get; set; }

多对多关系。

有一个与以下 ViewModel 关联的视图。在其中我可以编辑地点详细信息 - 并编辑与该地点相关联的标签(例如,该地点可能有一个“餐厅”标签和一个“酒吧”标签 - 也许我想添加一个“咖啡馆”标签,并且删除“餐厅”标签)。

PlacesWithTagsViewModel:

public Place place { get; set; }
public ICollection<Tag> SelectedTags { get; set; }

当视图返回控制器时,我会像这样更新标签:

place.Tags = SelectedTags
db.Entry(ptvm.place).State = EntityState.Modified;
db.SaveChanges();

但是,位置属性会更新(例如名称) - 但标签始终保持不变。

如何更新标签?

【问题讨论】:

  • 我遇到了同样的问题。最后,我强制先删除所有子实体,然后将新实体添加到父实体。如果您想要这种方法,请告诉我给您发送示例

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5


【解决方案1】:

避免 db.Entry(ptvm.place).State = EntityState.Modified;,因为它会导致没有更新的冲突。

您必须使用 UpdateModel(table object, "model");

完整示例如下:

[HttpPost]
public ActionResult PlaceTag(PlacesWithTagsViewModel model)
{
    if (ModelState.IsValid)
    {
       tag tagtest = GetTagById(model.tagid);
       tag.name= model.tag.name;
       tag.nameplural = model.tag.nameplural;
       UpdateModel(tag, "model");
       db.SaveChanges();
       return RedirectToAction("Index", "Dashboard", new { id = 5 });
    } 
}

UpdateModel 的优点是您只需提及您更新的那些字段,避免那些保持静态的字段。通过这种方式,您可以在 Edit View 中使用 Viewmodel 更新相关数据。

【讨论】:

  • 谢谢。我没有解释清楚。这里没有更新标签 - 我只需要更新与 Place 关联的标签。 (多对多关系)。例如 - 一个地方可以被标记为“餐厅”和“咖啡馆”。我可能想在更新期间关联一个额外的标签“酒吧”,并删除一个“餐厅”。
  • 你能否也澄清一下什么问题 db.Entry(model).State = EntityState.Modified;原因? Microsoft 将其包含在脚手架中是不是一个坏主意?
  • @user2254951 使用db.Entry(model).State = EntityState.Modified; 您将面临并发冲突(锁定)在同一控制器操作中有两个或多个CRUD 操作的情况。所以我更喜欢性能保持乐观的UpdateModel。
  • 好的 - 对我的主要问题有任何想法 - 为什么相关标签没有被更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多