Utilisation d'Entity Framework 4.0 avec Code-First et POCO: Comment obtenir un objet parent avec tous ses enfants?

code-first entity-framework one-to-many poco

Question

Je suis nouveau sur EF 4.0, alors c'est peut-être une question facile. J'ai le VS2010 RC et le dernier EF CTP. J'essaie d'implémenter l'exemple de code "clés étrangères" en premier sur le blog de conception de l'équipe EF, http://blogs.msdn.com/efdesign/archive/2009/10/12/code-only-further-enhancements. aspx .

public class Customer
{
   public int Id { get; set; 
   public string CustomerDescription { get; set; 
   public IList<PurchaseOrder> PurchaseOrders { get; set; }
}

public class PurchaseOrder
{
   public int Id { get; set; }
   public int CustomerId { get; set; }
   public Customer Customer { get; set; }
   public DateTime DateReceived { get; set; }
}

public class MyContext : ObjectContext
{
   public RepositoryContext(EntityConnection connection) : base(connection){}
   public IObjectSet<Customer> Customers { get {return base.CreateObjectSet<Customer>();} }
}

J'utilise un ContextBuilder pour configurer MyContext:

{
   var builder = new ContextBuilder<MyContext>();

   var customerConfig = _builder.Entity<Customer>();
   customerConfig.Property(c => c.Id).IsIdentity();

   var poConfig = _builder.Entity<PurchaseOrder>();
   poConfig.Property(po => po.Id).IsIdentity();

   poConfig.Relationship(po => po.Customer)
      .FromProperty(c => c.PurchaseOrders)
      .HasConstraint((po, c) => po.CustomerId == c.Id);

   ...
}

Cela fonctionne correctement lorsque j'ajoute de nouveaux clients, mais pas lorsque j'essaie de récupérer des clients existants. Ce code enregistre avec succès un nouveau client et tous ses enfants PurchaseOrders:

using (var context = builder.Create(connection))
{
   context.Customers.AddObject(customer);
   context.SaveChanges();
}

Mais ce code ne récupère que les objets Client; leurs listes PurchaseOrders sont toujours vides.

   using (var context = _builder.Create(_conn))
   {
      var customers = context.Customers.ToList();
   }

Que dois-je faire d'autre à ContextBuilder pour que MyContext récupère toujours tous les PurchaseOrders avec chaque client?

Réponse populaire

Vous pouvez aussi utiliser:

var customers = context.Customers.Include("PurchaseOrders").ToList();

Ou activez le LazyLoading dans les ContextOptions:

context.ContextOptions.LazyLoadingEnabled = true;

Soyez prudent avec le chargement différé si vous sérialisez les objets ou si vous finissez par interroger toute la base de données.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow