1

私のコードはこれです:

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

UsersXXX にブレークポイントを設定し、オブジェクトがまだ実際の値でインスタンス化されていることを確認しました。遅延読み込みが実際に何を意味するのかはわかりませんが、確かに読み込みが行われています。しかし、私はまだこのエラーが発生します:

ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

なぜこうなった?オブジェクトUsersは using ブロックの外で宣言されているため、ガベージ コレクターはオブジェクトがまだ使用されていることを追跡するべきではありませんか?

これを処理する方法は何ですか?


わかりました、原因がわかりました。User クラスには、ナビゲーション プロパティ PINS があります。Include メソッドがあることを読みました。ただし、この特定の方法では PINS プロパティは必要ありません。代わりに Exclude メソッドはありますか?

returnステートメントの前に次のことを試しましたが、同じエラーがまだあります。

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

1 に答える 1

0

シリアル化するプロパティのみを含むカスタム C# クラスである DTO (データ転送オブジェクト) を作成できます。

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

Entity REST SDK もチェックしてください。Entity Framework 用の REST SDK を作成しました。これは、ログオンしているユーザーのタイプに基づいて、エンティティの自動フィルタリングとシリアル化からのプロパティの非表示を可能にする Security Context の概念を含む、おそらくすべての仕事を行います。

http://entityrestsdk.codeplex.com

于 2013-11-04T06:10:39.713 に答える