2016-05-13 152 views
2

我對Action返回給我的錯誤感到困惑。我有我的經理代碼:Json的實體框架模型結果

public class AddressesManager 
    { 

    private SiteDBEntities entityContext; 

    public Addresses GetAddress(short id) 
      { 
       entityContext = new SiteDBEntities(); 
       var addressList = entityContext.Addresses.Where(a => a.Id == id).FirstOrDefault(); 
       entityContext.Dispose(); 
       return addressList; 
      } 
} 

和行動調用這個函數:

[HttpPost] 
     public ActionResult LoadAddress(short id) 
     { 
      AddressesManager mngr = new AddressesManager(); 
      Addresses address = mngr.GetAddress(id); 
      return new JsonResult() { Data = address }; 
     } 

和jQuery代碼至極呼叫thit行動:

$.post("/Cart/LoadAddress", { id: id }) 
     .success(function (data) { 

      console.log(data); 
     }) 
    .fail(function (e) { console.log(e) }); 

行動正在運行,但我總是得到500錯誤惠特代碼:

T他的ObjectContext實例已經處理完畢,不能再用於需要連接的操作。

據我所知,問題是與entityContext,但爲什麼會發生這種情況?我已經從執行DB數據,我也不需要連接了...

編輯:

Thit是我的地址模型。它由EF自動生成:

public partial class Addresses 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     public string State { get; set; } 
     public string Country { get; set; } 
     public string Warehouse { get; set; } 
     public string FirstName { get; set; } 
     public string SecondName { get; set; } 
     public string Phone { get; set; } 
     public short DeliveryType { get; set; } 
     public System.Guid UserId { get; set; } 

     public virtual DeliveryType DeliveryType1 { get; set; } 
     public virtual Users Users { get; set; } 
    } 
+0

我查地址變量數據 - 一切OK現在和數據在這裏 – dantey89

+0

發生這種錯誤,因爲地址類有一定的虛擬性,並且將它轉換成JSON,它要得到這些虛擬財產了。 – Kahbazi

+0

是的,你是對的。就是這個。那麼避免這個錯誤的方法是什麼?手動映射模型? – dantey89

回答

0

您的地址類中是否有導航(兒童)屬性?在DbContext被處理後,我感覺你正試圖訪問這個子屬性,因爲默認情況下子屬性是延遲加載的。

你能發表你的地址模型的代碼嗎?

+0

是一個在我的經理的析構函數中使用EFcontext.Dispose()以避免延遲加載的問題的良好做法? – dantey89

0

我想你應該將屬性[JsonIgnore]添加到Addresses類的虛擬屬性。

class Addresses 
{ 
    public int ID { get; set; } 

    [JsonIgnore] 
    public virtual Something Something { get; set; } 
} 
0

地址應該在您的情況下延遲加載。所以你試圖訪問處置的數據和實體框架試圖使用處置的上下文,並給出一個例外。

也許你需要你的AddressList中附加到當前上下文,以使延遲加載

var addressList = entityContext.Addresses.Where(a => a.Id == id).FirstOrDefault(); 
entityContext.Addresses.Attach(addressList); 
0

當你在MVC返回JSON記錄你需要添加AllowGet像這樣在你的控制器:

return Json(new { data= address }, JsonRequestBehavior.AllowGet); 

有了這個,你應該沒問題。

1

發生此錯誤是因爲您的Address類具有2個虛擬屬性:DeliveryType1Users

當您將address轉換爲JSON時,它將嘗試訪問這些虛擬屬性。但是,那個時候,你的語境已經被處理了。

爲避免此問題,您不應直接返回EF自動生成的類。相反,創建一個DTO對象(數據傳輸對象),僅包含您需要的一些字段,將其映射到EF對象並返回。例如:

public class AddressesDTO 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string State { get; set; } 
    public string Country { get; set; } 
    public string Warehouse { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    public string Phone { get; set; } 
    public short DeliveryType { get; set; } 
    public System.Guid UserId { get; set; } 
} 

然後,圖吧:

public Addresses GetAddress(short id) 
{ 
    entityContext = new SiteDBEntities(); 
    var addressList = entityContext.Addresses.Where(a => a.Id == id).FirstOrDefault(); 

    // Create DTO object 
    AddressesDTO address = new AddressesDTO(); 

    // Map it 
    address.Id = addressList.Id; 
    address.Title = addressList.Title 
    // Go on, it's quite long... 

    entityContext.Dispose(); 
    return address; 
} 

然而,正如你所看到的,映射過程是很枯燥的。更好的方法是使用Automapper

1

如果你想使用你的實體數據模型那麼我建議你去看看我在這個post答案。

現在,我會做的是創建一個DTO只得到你需要傳遞給你的視圖,如被提出@AnhTriet數據。爲避免每次需要將您的查詢投影到您的DTO時自己映射每個屬性,我建議使用Automapper。讓我告訴你,如果你決定使用它怎麼會是你的解決方案:

public class AddressesManager 
{ 
    public Addresses GetAddress(short id) 
    { 

     using(var entityContext = new SiteDBEntities()) 
     { 
      var address = entityContext.Addresses 
             .Where(a => a.Id == id) 
             .ProjectTo<AddressDTO>() 
             .FirstOrDefault(); 
      return address; 
     } 
    } 
} 

關於ProjectTo擴展方法。

+0

感謝您的信息。我目前正在學習課程,並且從小組的成員那裏聽說他們使用Automaper時表現不佳。所以他們決定使用自定義映射。 – dantey89

+0

你對DTO的評論對我來說是最有用的。現在我可以更清楚地瞭解程序架構 – dantey89

+0

不客氣;)。關於Automapper,我必須說至少在我的情況下,我沒有遇到過這樣的問題。但我認爲一切都取決於您創建查詢的方式,因爲最後會轉換爲SQL,如果您在Linq查詢中執行效率低下的操作或映射不必要的數據,當然這會影響您的性能。 – octavioccl