2012-05-08 5 views
1

EFでWCFサービスを作成しています。 カスタマーエンティティの子を返すときに問題が発生します。WCF Entity Frameworkがエンティティの子にアクセスできない

[DataContract] 
public class Customer 
{ 
     [Key] 
     [DataMember] 
     public int CustomerID { get; set; } 

     [DataMember] 
     public string FirstName { get; set; } 

// Customer has a collection of BankAccounts 
     [DataMember] 
     public virtual ICollection<BankAccount> BankAccounts { get; set; } 
} 

[DataContract(IsReference = true)] 
    public class BankAccount 
    { 
     [Key] 
     [DataMember] 
     public int BankAccountID { get; set; } 

     [DataMember] 
     public int Number { get; set; } 

     // virtual property to access Customer 
     //[ForeignKey("CustomerID")] 
     [Required(ErrorMessage = "Please select Customer!")] 
     [DataMember] 
     public int CustomerID { get; set; } 

     [DataMember] 
     public virtual Customer Customer { get; set; } 
    } 

私が取得エラー:

public Customer GetCustomer(int customerId) 
     { 
      var customer = from c in dc.Customers 
          where c.CustomerID == customerId 
          select c; 
      if (customer != null) 
       return customer.FirstOrDefault(); 
      else 
       throw new Exception("Invalid ID!"); 

     } 

私はそれをデバッグしようとしたが、この関数が戻る:私は呼ん

An error occurred while receiving the HTTP response to http://localhost:8732/Design_Time_Addresses/MyServiceLibrary/MyService/. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. 

サービス機能のサンプルコードの下 顧客とそれは 子供のBankAccounts、私も遅延読み込みを無効にしました。 は、私は私がこのラインに

public virtual ICollection<BankAccount> BankAccounts { get; set; } 

フォームの顧客クラスをコメントアウトした場合、すべてが私は銀行口座のを取得することはできませんを除いて、それが唯一の顧客を返す動作することが分かりました。 私はWCFを新しくしていますので、私を助けてください。 Thanx。

私は問題を解決する方法を見つけました。 ただIgnoreDataMember

[IgnoreDataMember] 
public virtual Customer Customer { get; set; } 

とMyDbContextコンストラクタでディアブルProxyCreationとして銀行口座のからお客様のリファレンスをマークしなければなりませんでした。

this.Configuration.ProxyCreationEnabled = false; 
+0

ヒント:if文を使用してExceptionをスローするのではなく、return customer.Single();を使用してください。正確に1つのマッチが予想される場合は、シングルを使用する必要があります。 – cederlof

+0

これは、ナビゲーションプロパティが仮想であるためです。 [この回答](http://stackoverflow.com/a/15822764/704144)を参照してください。 –

答えて

0

この機能では熱心な読み込みを使用しないため、顧客と顧客のアカウントの両方を返すにはレイジーローディングが有効になっている必要があります。あなたが使用する必要があります遅延ロードを無効にする場合:とにかく、あなたの主な問題を

dc.Customers.Include("BankAccounts") 

をデフォルトWCFのシリアル化を破る循環参照(顧客が口座と口座への参照は、顧客への後方参照を持っている)です。あなたはその存在についてinform serializerでなければなりません。

+0

ありがとうございますが、私の問題は依然として続きます。 – Razuro

+0

あなたは私が答えで提供したリンクをたどったのですか? –

+0

はい、私はそれを見ました。そこには、EF4エンティティをシリアル化できないことがわかっている画像が見えました。私は私のものを確認して、私のものは同じように見えたので、ProxyCreationを無効にしました。それでも、私はProxyCreationが何をしているか完全に理解していませんでした。ありがとうございました。 – Razuro

関連する問題