下面是我保存多选框的代码,它工作正常,但是当我尝试编辑记录时,我得到以下错误。什么是添加其他选定标签的最佳方法,并在编辑时删除任何未选择的标签?
失败,因为同一类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
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"/> }
答案 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();
}