【问题标题】:Unable to update model with virtual list无法使用虚拟列表更新模型
【发布时间】: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


【解决方案1】:

试试这个,

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

【讨论】:

  • 因此,我们需要“包含”虚拟集合以让 EF 进行更改跟踪。非常感谢您花时间提供准确的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2013-08-06
  • 2020-02-25
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多