2013-11-03 119 views
1

我的代碼是這樣的:ObjectContext的實例已經被佈置,但我已經複製了對象

[HttpGet] 
    public List<User> GetUsers() 
    { 
     List<User> Users; 
     using (Entities db = new Entities()) 
     { 
      var users = from u in db.Users select u; 
      Users = users.ToList(); 
     } 
     //XXX 
     return Users; 
    } 

我把一個斷點XXX並確認該物體Users仍與實際值實例化。我不知道Lazy Loading實際上意味着什麼,但確實發生了一些負載。但我仍然得到這個錯誤:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

爲什麼會發生這種情況?對象Users在using塊之外被聲明,所以垃圾回收器不應該跟蹤對象仍在使用中嗎?

處理這個問題的方法是什麼?


好的,我找到了原因。用戶類具有導航屬性PINS。我讀過有一個包含方法。但是PINS屬性在這個特定的方法中不是必需的。是否有排除方法?

我在return語句之前嘗試了以下內容,但同樣的錯誤仍然存​​在。

 foreach (var user in Users) user.PINS = null; 
+0

您應該在導航屬性上使用XmlIgnore或ScriptIgnore。 –

+0

我只想忽略這種特殊情況。用戶類在別處使用時可能需要PINS屬性。 –

回答

0

您可以創建DTO(數據傳輸對象),它是一個自定義的C#類,它只包含要序列化的屬性。

[HttpGet] 
public List<UserDTO> GetUsers() 
{ 
    List<UserDTO> Users; 
    using (Entities db = new Entities()) 
    { 
     var users = from u in db.Users select u; 
     Users = users.ToList().Select(x=> new UserDTO(x)).ToList(); 
    } 
    //XXX 
    return Users; 
} 

public class UserDTO{ 

    public UserDTO(User user){ 
     this.Username = user.Username; 
     ... 
    } 

    public string Username {get;set;} 
    ... 
    // properties you want to serialize 
    ... 
} 

而且你有點不正確執行API,

我會建議使用下面的模式,

public class DataAPI : APIController{ 

    protected Entities DB { get; private set; }; 

    public DataAPI(){ 
     DB = new Entities(); 
    } 

    // This ensures that your Context will live 
    // till end of the request, so you will not 
    // get dispose exception 
    public override void Dispose(){ 
     DB.Dispose(); 
    } 
} 

也會檢出實體REST SDK,我已經寫了REST SDK對實體框架,這可能完成所有工作,包括安全上下文的概念,允許自動過濾實體,並根據登錄用戶的類型從序列化中隱藏屬性。

http://entityrestsdk.codeplex.com

+0

謝謝。這將意味着必須複製我需要的所有屬性。 –

相關問題