2010-11-08 27 views
1

J'utilise ASP.NET MVC2 avec EF4. J'ai besoin de créer des POCOs pour deux de mes classes PersonP et AddressP, qui correspondent à leurs classes 'complexes' EF4 (qui incluent des choses comme les propriétés de navigation et OnPropertyChanged()). Mapper juste PersonP fonctionne très bien, mais PersonP contient AddressP (clé étrangère) - comment est-ce que je fais correspondre ceci à l'aide d'une expression IQueryable?IQueryable Entity Framework Mappages POCO

Voici ce que j'ai essayé:

class AddressP 
{ 
int Id { get; set; } 
string Street { get; set; } 
} 

class PersonP 
{ 
int Id { get; set; } 
string FirstName { get; set; } 
AddressP Address { get; set; } 
} 

IQueryable<PersonP> persons = _repo.QueryAll() 
    .Include("Address") 
    .Select(p => new PersonP 
{ 
Id = p.Id, 
FirstName = p.FirstName, 
//Address = p.Address <-- I'd like to do this, but p.Address is Address, not AddressP 
//Address = (p.Address == null) ? null : 
//new AddressP <-- does not work; can't use CLR object in LINQ runtime expression 
//{ 
// Id = p.Address.Id, 
// Street = p.Address.Street 
//} 
}); 
  1. Sans .Include("Address") je ne voudrais pas récupérer quoi que ce soit de la table d'adresses est correcte?

  2. Comment puis-je la carte Address-AddressP à l'intérieur PersonP, en utilisant l'instruction Select() ci-dessus?

Merci.

Répondre

1
  1. C'est exact, si vous avez disable Lazy Loading ou le contexte de votre objet a été supprimé déjà et ne peuvent pas être utilisés pour obtenir Lazy travail en cours de chargement. Oui, cela ne fonctionnera pas car vous devez d'abord exécuter votre requête et commencer à la mapper, sinon votre logique de mappage sera exécutée dans la base de données, d'où l'exception.
    Quelque chose comme cela fonctionnera:
// First we execute the query: 
IQueryable<PersonP> persons = _repo.QueryAll().Include("Address").ToList(); 

// Now we have a IEnumerable and we can safely do the mappings: 
persons.Select(p => new PersonP 
{ 
    Id = p.Id, 
    FirstName = p.FirstName, 
    Address = (p.Address == null) ? null : new AddressP() 
    { 
     Id = p.Address.Id, 
     Street = p.Address.Street 
    } 
}).ToList(); 

Bien que cette solution fera l'affaire, mais si l'intention est d'avoir des classes POCO vous devriez certainement envisager de tirer parti des classes de soutien EF4.0 POCO et utiliser directement POCO avec EF au lieu de les cartographier ensuite. Un bon endroit pour commencer serait cette procédure pas à pas:
Walkthrough: POCO Template for the Entity Framework

+0

Merci pour votre réponse, c'est exactement ce que je cherchais. Malheureusement, je dois le garder comme IQueryable parce que je dois appliquer filter/tri/grouping en utilisant une méthode tierce, et le référentiel de personne/adresse peut être énorme - donc je dois le faire avant d'exécuter la requête réelle. Je me pencherai sur le support de POCO EF4. Recommanderiez-vous la solution NHibernate par rapport à cela, selon votre expérience? – John

+0

Je n'avais aucune expérience avec NHibernate, mais je ne pense pas que ce soit différent. Vous pouvez également regarder dans AsQueryable pour voir si vous pouvez l'utiliser mais je pense toujours que POCO est la voie à suivre dans ce scénario. –