无法使用虚拟列表更新模型

时间:2014-07-18 09:06:05

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

我的电影模型有一个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集合?任何形式的帮助都表示赞赏。

1 个答案:

答案 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");
}