我的电影模型有一个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 Controller -
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集合?任何形式的帮助都表示赞赏。
答案 0 :(得分:0)
试试这个,
if (ModelState.IsValid)
{
Movie movieDb;
if (movie.MovieId == 0)
{
movieDb = new Movie { Actors = new List<Actor>() };
_db.Movies.Add(movieDb);
}
else
{
movieDb = _db.Movies.Include(m => m.Actors).FirstOrDefault(m => m.MovieId == movie.MovieId);
}
// Sets producer.
int session_producerId = (int)Session["ProducerId"];
movieDb.Producer = _db.Producers.Find(session_producerId);
movieDb.ProducerId = session_producerId;
// Sets actors.
List<int> actors = Session["Actors"] as List<int>;
ICollection<Actor> session_actors = _db.Actors.Where(a => actors.Contains(a.ActorId)).ToList<Actor>();
Array.ForEach(session_actors.ToArray(), actor => movieDb.Actors.Add(actor));
// Sets other movie's properties here..
// finally save changes
_db.SaveChanges();
// removing session information
Session.Clear();
return RedirectToAction("Index");
}