MVC MultiSelect EF多对多编辑

时间:2014-04-15 22:35:55

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

下面是我保存多选框的代码,它工作正常,但是当我尝试编辑记录时,我得到以下错误。什么是添加其他选定标签的最佳方法,并在编辑时删除任何未选择的标签?

  

失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。

public class Post
{     
    public Guid PostId { get; set; }     
    public string Name { get; set; }       
    public virtual ICollection<Tag> Tags { get; set; }
}

  public class Tag
{
    public int TagId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Create()
    {
        var tags = new List<Tag>()
            {
                new Tag() { TagId = 1, Name = "Planes", Posts = new Collection<Post>() },
                new Tag() { TagId = 2, Name = "Cars", Posts = new Collection<Post>() },
                new Tag() { TagId = 2, Name = "Boats", Posts = new Collection<Post>() }
            };

        ViewBag.MultiSelectTags = new MultiSelectList(tags, "TagId", "Name");

        return View();
    }

    [HttpPost]
    public ActionResult Create(Post post, int[] tags) 
    {

           foreach (var tag in tags)
            {
                Tag t = db.ThemeFeatures.Where(t => t.TagId== tag).First();
                themedetails.ThemeFeatures.Add(t);   
            }

         context.SaveChanges();

        return RedirectToAction("Create");
    }

}

创建视图

  

@model MvcApplication1.Models.Post

     

创建

     

@using(Html.BeginForm(“Create”,“Home”,FormMethod.Post)){       名称       @ Html.TextBoxFor(model =&gt; model.Name)

<label>Tags For Post</label>
@Html.ListBox("Tags", (MultiSelectList)ViewBag.MultiSelectTags)

<input type="submit" value="Submit Post"/> }

1 个答案:

答案 0 :(得分:2)

您要做的是确保您添加子实体的实体附加到对象上下文。最简单的方法是使用视图中的POSTed ID获取一个新的上下文对象。

你不会担心任何担心让对象拥有 所拥有的对象的区别。处理它的最简单方法是简单地清除其子集合的对象,并添加从POST返回的所有内容。

[HttpPost]
public ActionResult Create(Post post, int[] tags) 
{
     ...
     var freshPost = db.Posts.Find(post.ID);
     freshPost.Tags.Clear();
     foreach (var tag in tags)
     {
         Tag t = db.ThemeFeatures.Find(tag);
         freshPost.Tags.Add(t);
     }

     context.SaveChanges();
}