2

我想更新一個「發佈」並更改之前創建的「類別」的關係。郵政實體具有分類收集。但類別沒有改變。看起來,EF不跟蹤實體關係。順便說一下,我通過分配類別創建新文章沒有問題。ASP.NET MVC 3,實體框架4.更新與許多相關的實體

有兩種模式:

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

編輯器不會保存更改類別,只能張貼道具。

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

難道我做錯了什麼?

在此先感謝

回答

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. 首先附加用於裝載相關實體
  2. 清除存在的關係與包括對象(EntityState.Modified)
  3. 查詢對象或其他方法。我不喜歡這樣,但我找不到另一種方式
  4. 從視圖和SaveChanges中分配新的關係。
1

實體框架不會追蹤關係改變了這種方式。它只跟蹤對象的狀態,所以正確的方法是加載所有類別的「Post」,然後修改加載的集合 - 這樣,所有對象的狀態都會發生變化。

0

操作類別集合,即(添加,刪除,編輯)在課程後。如果您使用相同的DbContext,則會跟蹤更改。它應該工作。

添加類別

_post.Categories.Add(category1); 

刪除類別

_post.Categories.Remove(category1); 

編輯類

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

udapte目的

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