2012-01-25 3 views
1

J'ai jeté un coup d'œil aux questions similaires, mais je n'ai pas encore trouvé de solution. Je l'ai essayé d'utiliserEntity Framework via les propriétés de navigation WCF non remplies

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

mais mes propriétés de navigation sont encore vides quand je les récupérer par mon service WCF.

Voici mes entités:

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

Utilisation de l'API couramment Je déclare que les deux entités hasMany d'adresses/résidents respectivement. Mon code de service WCF ressemble à ceci:

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

Et enfin, j'invoquait mon service comme celui-ci:

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

Toute personne idées?

+0

Les adresses sont-elles déjà manquantes côté serveur (dans 'GetAllPeople()') ou seulement chez le client (dans 'Main')? BTW: Je pense que le réglage 'ProxyCreationEnabled = false' et' LazyLoadingEnabled = true' n'a pas de sens parce que le chargement paresseux ne peut pas fonctionner sans proxy. Mais cela n'a probablement rien à voir avec votre problème puisque vous utilisez le chargement enthousiaste avec 'Include'. – Slauma

Répondre

1

Les propriétés de navigation ne sont pas étendues par défaut. Et il n'y a aucun moyen sur le serveur de les forcer à se développer. Le client peut le faire facilement en demandant/People? $ Expand = Adresses.

Questions connexes