2011-06-29 7 views
2

私はthisガイドをフォローしていますが、エラーが発生しています。誰でも助けてくれますか?WCFデータサービスを使用しているときのエラー

私のデータモデルのコードは、Webサービスがエラー

が配置 object.Object名にアクセスすることはできませんできます

namespace Datalayer { 
    public class DataModel { 

     public DataModel() 
     { 
      using (btWholesaleDataContext db = new btWholesaleDataContext()) { 
       //! requires auth 
       var MACRequestList = from r in db.btRequests 
            select new Models.BT.Request { 
             ID = r.ID, 
             Date = r.DateTime, 
             StatusCode = 3, 
             Status = r.Status 
            }; 

       MACRequests = MACRequestList.AsQueryable(); 

      } 
     } 

     public IQueryable<Models.BT.Request> MACRequests { get; private set; } 
    } 
} 

を下回っている: 'DataContextの は処分後にアクセス'私はMACRequests

にアクセスすると、私は私が壊れていると思うのコードのみを掲載している

。あなたがもっと見たいと思ったらもっと教えてください。

答えて

4

を作るようにします。ただし、IQueryable MACRequestsプロパティを使用する場合は、そのコンテキストが処分されている必要があります。これを処理するための1つの可能な方法は、あなたのクラスIDisposableインターを作成し、コンテキストをそのように配置してある

public class DataModel : IDisposable { 

    private btWholesaleDataContext wholesaleDataContext; 

    public DataModel() 
    { 
     wholesaleDataContext = new btWholesaleDataContext(); 
     //! requires auth 
     var MACRequestList = ... ; 

     MACRequests = MACRequestList.AsQueryable(); 
    } 

    public IQueryable<Models.BT.Request> MACRequests { get; private set; } 

    public void Dispose() { 
     if(wholesaleDataContext != null) 
      wholesaleDataContext.Dispose(); 
    } 
} 

次に、あなたがたDataModelが適切にそれを使用していますどんなことで配置されていることを確認する必要があります。

別の代替ではなくのIQueryableの項目のMACRequests実際のリストを作ることです。

public class DataModel { 

    public DataModel() 
    { 
     using (btWholesaleDataContext db = new btWholesaleDataContext()) { 
      //! requires auth 
      var MACRequestList = ... ; 

      MACRequests = MACRequestList.ToList(); // ToList reads the records now, instead of later. 

     } 
    } 

    public List<Models.BT.Request> MACRequests { get; private set; } 
} 
+0

IDisposableから継承することは、非常にエレガントなソリューションです。ありがとう!いつでも実行されるウェブサイトを運営しているので、アプリケーションの開始時および終了時にDataModelを作成して廃棄するか、呼び出すたびに作成および廃棄しますか? –

1

MACRequestsへのクエリは遅延されます。使用ブロックから外れ、DataContextが破棄されると、必要なクエリを作成できなくなります。

2

あなたはIQueryable <を使用しているので、私はそれを考えています。その怠惰にサービスを照会します。 使用一覧>代わりに<それはすぐに

を照会したり、データコンテキストがusing { }ブロックの最後に、あなたのコンストラクタの端部に配置されているメンバ変数に「btWholesaleDataContextのデシベル」

0

あなたがそうで...あなたのDataModelのコンストラクタで使用してブロック内のデータコンテキストを作成していますMACRequestsにアクセスすると、データコンテキストが破棄されます。

は、次のことを考えてみましょう:この用法が動作することを

public class DataModel : IDisposable { 
    btWholesaleDataContext db = new btWholesaleDataContext(); 

    public void Dispose() 
    { 
     btWholesaleDataContext.Dipose(); 
    } 

    public IQueryable<Models.BT.Request> MACRequests { 
      get { 
           return from r in db.btRequests 
           select new Models.BT.Request { 
            ID = r.ID, 
            Date = r.DateTime, 
            StatusCode = 3, 
            Status = r.Status 
           }; 
      } 
    } 
} 

注:

using (var dm = new DataModel()) 
{ 
    dm.MACRequests.ToArray(); 
} 

が、これはオリジナルと同じ理由で失敗します:

IQueryable<Models.BT.Request> requests = null; 

using (var dm = new DataModel()) 
{ 
    requests = dm.MACRequests; 
} 

// this will fail because the context is disposed by the time we force enumeration of the query 
requests.ToArray(); 

.. 。代わりに、WCFデータサービスは投影をフィルタリングすることができないため、クエリで実際に行うことができます。

         from r in db.btRequests 
            select new Models.BT.Request { 
             ID = r.ID, 
             Date = r.DateTime, 
             StatusCode = 3, 
             Status = r.Status 
            }; 

実行しています...

元のコードを変更して、配列またはリストをクエリ可能なものとして残す代わりに返すことを検討してください。

関連する問題