2012-01-25 9 views
1

私は同様の質問をしましたが、解決策はまだ見つかりませんでした。私はWCFを使用したエンティティフレームワークのナビゲーションプロパティがポピュレートされない

  1. .Include("")
  2. .Load()

を使用してみましたが、私は私のWCFサービスを介してそれらを取得するときに私のナビゲーションプロパティは空のままです。ここで

は私の実体である:

public class Person 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 

    public Person() 
    { 
     this.Addresses = new List<Address>(); 
    } 
} 

public class Address 
{ 
    public int AddressID { get; set; } 
    public string AddressLine1 { get; set; } 
    public virtual ICollection<Person> Residents { get; set; } 

    public Address() 
    { 
     this.Residents = new List<Person>(); 
    } 
} 

私はそれぞれのアドレス/住民の両方のエンティティのhasManyをすることを宣言しています流暢なAPIを使用します。私のWCFサービスコードは次のようになります。

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
public class Repository : DataService<EFEntitiesDataContext> 
{ 
    // This method is called only once to initialize service-wide policies. 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.UseVerboseErrors = true; 

     config.SetEntitySetAccessRule("*", EntitySetRights.All); 
     config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); 

     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
    } 

    protected override EFEntitiesDataContext CreateDataSource() 
    { 
     EFEntitiesDataContext dataSource = new EFEntitiesDataContext(); 
     dataSource.Configuration.ProxyCreationEnabled = false; 
     dataSource.Configuration.LazyLoadingEnabled = true; 
     return dataSource; 
    } 

    [WebGet] 
    public IList<Person> GetAllPeople() 
    { 
     EFEntitiesDataContext context = this.CreateDataSource(); 
     return context.People.Include("Addresses").Where(n => n.Addresses.Any()).ToList(); 
    } 
} 

そして最後に、私はこのように私のサービスを呼び出しています:

static void Main(string[] args) 
{ 
    Uri uri = new Uri("http://localhost:49479/Repository.svc"); 

    RepositoryService.EFEntitiesDataContext repositoryService = new RepositoryService.EFEntitiesDataContext(uri); 

    Uri uriRequest = new Uri(string.Concat(repositoryService.BaseUri, "/GetAllPeople")); 
    foreach (var person in repositoryService.Execute<RepositoryService.Person>(uriRequest)) 
    { 
     System.Console.WriteLine("Name: " + person.Name + ", Addresses: " + person.Addresses.Count.ToString()); 
    } 

    System.Console.ReadKey(); 
} 

任意のアイデア誰ですか?

+0

サーバ側( 'GetAllPeople()')またはクライアント( 'Main'内)のみにアドレスが既にありますか?ところで、私は 'ProxyCreationEnabled = false'と' LazyLoadingEnabled = true'を設定することは理にかなっていません。なぜなら、遅延ロードはプロキシなしでは動作できないからです。しかし、あなたが 'Include'を使って熱心な読み込みをしているので、あなたの問題とは何の関係もないでしょう。 – Slauma

答えて

1

デフォルトではナビゲーションプロパティは展開されません。サーバーを拡張する方法はありません。クライアントは、/ Peopleを要求することで簡単に実行できます。$ expand = Addresses。

関連する問題