2014-03-02 30 views
0

我有一個表單,用戶可以用jQuery插入項目的照片。延遲實體框架SaveChanges到下一個動作

我無法在用戶上傳圖片時保存圖片,因爲尚未創建該項目導致外鍵衝突。

我已經創建了一個基本控制器,itemcontroller和fileuploadcontroller都繼承。在這個基礎控制器中創建一個新的DBContext對象。

我填充了用戶上傳到共享DBContext中的圖像,當用戶最終提交表單時,該項目被創建並保存(在它自己的DBContext中),然後嘗試使用共享DBContext保存圖像。

問題是,在這一點上,我以前添加的圖像不再在DBContext中,因此圖像不會保存在數據庫中。

我在做什麼錯了?我可以刪除外鍵來解決問題,但我不認爲這是個好主意。

+0

沒有代碼,這是很難判斷:初始化圖形和與其相關實體添加新的實體

public class ItemService { public ItemEntity AddItem(ItemEntity e) { if (e != null) { using (var context = new MyContext()) { IDbSet<ItemEntity> entitySet = context.Set<ItemEntity>(); var entity = entitySet.Add(e); context.SaveChanges(); return entity; } } return null; } } 

代碼。您必須找到一種方法來通過一種上下文保存項目和圖像。這完全取決於物品和圖像如何相關,無論這是否容易。 –

回答

0

我會避免每個請求使用多個上下文(如果可能),或者每次至少只使用一個。我肯定會避免在基本控制器類中創建共享DBContext。事實上,我會避免在表示層完全使用EF代碼。 我寧願有一個「業務邏輯」層或「服務」層(後者是一個超載的術語),然後我用它來調用存儲庫層。但爲了簡單起見,只有一層可用。 您可以製作一個相關實體的圖形,它們是全部新,並且一次添加它們。 EF將全部插入。不過,不要試圖插入已經存在的使用此過程的子實體。它會一直嘗試添加附加到此圖的實體。

對於上傳的圖片還不存在,我會填充一個新的實體,上傳數據並將其添加到上下文的新實例中。那麼我會在當時的環境中調用SaveChanges()

新的服務類:

// gather the images into their respective entities, say Image1 and Image2 for an example 
var Image1 = new ImageEntity { // set the properties here }; 
var Image2 = new ImageEntity { // set the properties here }; 
var newItem = new ItemEntity 
       { 
        // set various scalar properties here 
        Images = { 
           Image1, Image2 
          } 
       }; 
var service = new ImageService(); 
var addedEntity = service.AddItem(newItem); // adds and commits