2013-11-03 57 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

谢谢。这将意味着必须复制我需要的所有属性。 –

相关问题