【问题标题】:ASP.NET MVC 3, Entity Framework 4. Update entity with relation to manyASP.NET MVC 3,Entity Framework 4。更新与许多相关的实体
【发布时间】:2011-11-09 21:32:24
【问题描述】:

我想更新“帖子”并更改与之前已创建的“类别”的关系。帖子实体具有类别的 ICollection。但是类别没有改变。看来,EF 不跟踪实体关系。顺便说一句,我可以通过分配类别来创建新帖子。

有两种型号:

public class Post
{
    public virtual  int PostId { get; set; }
    ...
    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public virtual int CategoryId { get; set; }
    ...
    public virtual ICollection<Post> Posts { get; set; }
}

添加控制器,按预期工作:

public ActionResult Create(Post model)
{
    var c = Request.Form["CategoryID"].Split(',');
    model.Categories = c.Select ... .ToList(); //here I assign relationships with attached objects
    _repository.Add(model);
    _repository.SaveChanges();
   ...         
}

存储库添加方法:

T IRepository.Add<T>(T entity)
{
   return Set<T>().Add(entity);
}

Edit 控制器不保存更改的类别,仅发布道具。

public ActionResult Edit(Post model)
{
   var c = Request.Form["CategoryID"].Split(',');
   model.Categories = c.Select ... .ToList(); //here I update relationships with attached objects
   _repository.Attach(model);
   _repository.SaveChanges();
   ...
}

存储库编辑方法:

T IRepository.Attach<T>(T entity)
{
  var entry = Entry(entity);
  entry.State = System.Data.EntityState.Modified;
  return entity;
}

我做错了吗?

提前致谢

【问题讨论】:

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


    【解决方案1】:

    修改一个对象

     string ImgID = CompCert.CertID.ToString() + "ComID" + CompId + ext;
                            CompCert.CertImageFile = ImgID;
                            db.ObjectStateManager.ChangeObjectState(CompCert, EntityState.Modified);
                            db.SaveChanges();
    

    【讨论】:

      【解决方案2】:

      解决方案:

      public ActionResult Edit(Post model)
          {
              model = _repository.Attach(model);
              var post = _repository.Posts.Include(p => p.Categories).Single(s => s.PostId == model.PostId);
              post.Categories.Clear();
              model.Categories = GetCategories();
              _repository.SaveChanges();
          }
      
      1. 首先附加对象(EntityState.Modified)
      2. 使用 Include 或其他加载相关实体的方法查询对象
      3. 清除现有关系。我不喜欢这样,但我找不到其他方法
      4. 从视图和 SaveChanges 分配新关系。

      【讨论】:

        【解决方案3】:

        在帖子类中操作类别集合,即(添加、删除、编辑)。如果您使用相同的 DbContext,则将跟踪更改。它应该工作。

        添加一个类别

        _post.Categories.Add(category1);
        

        删除类别

        _post.Categories.Remove(category1);
        

        编辑类别

         _post.Categories[0].Name = "TEST Name";
        

        【讨论】:

          【解决方案4】:

          实体框架不会以这种方式跟踪关系更改。它只跟踪对象的状态,因此正确的方法是加载您想要的所有类别的“帖子”,然后修改加载的集合 - 这样更改将反映在所有对象的状态中。

          【讨论】:

            猜你喜欢
            • 2018-02-27
            • 2016-10-10
            • 2017-05-05
            • 2011-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多