【发布时间】:2014-07-18 09:06:04
【问题描述】:
我的电影模型有一个 ICollection 的虚拟声明,除了一种情况外,它在所有情况下都可以正常工作。当我尝试从会话变量编辑列表并调用 _db.SaveChanges 时,它没有更新到 db。让我告诉我,我还有一个 ProducerId 字段(以及虚拟生产者)正在正确更新。哪里出错了?
电影模型 - Movie.cs
public class Movie
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int MovieId { get; set; }
public string Name { get; set; }
public string YearOfRelease { get; set; }
public string Plot { get; set; }
public string ImgUrl { get; set; }
[ForeignKey("Producer")]
public int ProducerId { get; set; }
public virtual Producer Producer { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
public virtual ICollection<MovieReview> Reviews { get; set; }
}
CreateOrEdit 控制器 -
public ActionResult CreateOrEdit([Bind(Include = "MovieId, Name, Plot, YearOfRelease")]Movie movie)
{
if (ModelState.IsValid)
{
int session_producerId = (int)Session["ProducerId"];
movie.Producer = _db.Producers.Find(session_producerId);
movie.ProducerId = session_producerId;
List<int> actors = Session["Actors"] as List<int>;
ICollection<Actor> session_actors = _db.Actors.Where(a => actors.Contains(a.ActorId)).ToList<Actor>();
movie.Actors = session_actors;
// add the movie to db before saving if creating new
if (movie.MovieId == 0)
_db.Movies.Add(movie);
else
// else trigger the edits
_db.Entry(movie).State = EntityState.Modified;
// finally save changes
_db.SaveChanges();
// removing session information
Session.Clear();
return RedirectToAction("Index");
}
return View(movie);
}
有人可以帮我理解为什么 _db.Entry(movie).State = EntityState.Modified 不更新 Actors 集合吗?任何形式的帮助表示赞赏。
【问题讨论】:
-
我不会从演员列表中删除演员。请正确阅读问题。
-
实际上你提到了从演员集中删除演员,所以当我将演员分配给电影对象时,我感到很困惑。来到你的答案,我可以知道为什么 EF 以不同的方式对待集合吗?另外,我需要手动“删除和添加”演员到电影收藏还是有更简单的方法?
-
在this post查看我的回答
-
虚拟关键字不应该负责分配吗?否则,如果要更新的集合太多,看起来工作量很大。我仍在寻找一个直观的答案。
-
我尝试了你提到的方法,但仍然不适合我。你能告诉我这里针对我的案例的解决方案是什么,为什么我的不工作。
标签: entity-framework asp.net-mvc-4