2011-09-18 3 views
2

J'ai deux entités:Entity Framework de charge paresseux

public class Product 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int ProductID { get; set; } 

     [Required(ErrorMessage="Please enter a product name")] 
     public string Name { get; set; } 

     [Required(ErrorMessage = "Please enter a description")] 
     [DataType(DataType.MultilineText)] 
     public string Description { get; set; } 

     [Required] 
     [Range(0.01,double.MaxValue,ErrorMessage="Please enter positive price")] 
     public decimal Price { get; set; } 

     public Category Category { get; set; } 

     [HiddenInput(DisplayValue= false)] 
     public string ImageFileName { get; set; } 

     [HiddenInput(DisplayValue = false)] 
     public string ImageMimeType { get; set; } 

    } 

et

public class Category 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int CategoryID { get; set; } 

     [Required(ErrorMessage="Please enter a category name")] 
     public string Name { get; set; } 

     [Required(ErrorMessage = "Please enter a description")] 
     [DataType(DataType.MultilineText)] 
     public string Description { get; set; } 


     public ICollection<Product> Products { get; set; } 

     [HiddenInput(DisplayValue= false)] 
     public string ImageFileName { get; set; } 

     [HiddenInput(DisplayValue = false)] 
     public string ImageMimeType { get; set; } 
    } 

Quand je suis en train d'obtenir le produit de cette façon

Product product = repository.Products.FirstOrDefault(p => p.ProductID == id); 

champ Catégorie est nul.

Il n'y a pas product.Category.Load() et repository.Products.Include ("Category") ... méthodes.

context.Configuration.LazyLoadingEnabled = false; 

n'affecte pas. Le contexte est un objet de la prochaine classe

public class EFDbContext:DbContext 
    { 
     public DbSet<Product> Products { get; set; } 
     public DbSet<Category> Categories { get; set; } 
    } 

Comment je charger champ nécessaire?

Merci

+0

Je viens d'essayer d'aller chercher l'objet Product de cette façon: Produit produit = (à partir de p dans le dépôt.Produits.Inclure ("Catégorie") où p. ProductID == id select p) .SingleOrDefault(); et la catégorie a été chargée aussi. C'est une solution possible. Mais il est intéressant de savoir pourquoi la catégorie est nulle lorsque j'utilise la première manière – xwrs

Répondre

2

Je viens d'essayer de chercher l'objet produit de telle manière:

Product product = (
    from p in repository.Products.Include("Category") 
    where p.ProductID == id 
    select p 
).SingleOrDefault(); 

et la catégorie a été chargé aussi. C'est une solution possible. Mais c'est intéressant pourquoi la catégorie est nulle quand j'utilise d'abord

+0

ce chargement n'est pas paresseux, non? – Elaine

2

Vous avez peut-être un problème avec votre définition de mappage. Êtes-vous capable de faire un GetAll sur votre table de catégorie? Votre propriété Product.Category sait-elle quelle clé étrangère utiliser pour la table Category?

L'article Using DbContext in EF 4.1 Part 6: Loading Related Entities explique différentes manières de charger vos entités en mode rapide ou paresseux.

Lorsque vous utilisez context.Configuration.LazyLoadingEnabled = false, vous définissez la manière globale pour charger les entités, mais si vous voulez, vous pouvez dire specificly comment chaque propriétés doivent être chargées en faisant ceci:

  • Exemple pour paresseux chargement: public virtual Category Category { get; set; }
  • Exemple désireux chargement: public Category Category { get; set; }

Donc, si cela ne fonctionne pas pour vous, je vérifierais votre définition de mappage, puis vérifier la requête sql qui est envoyée à votre base de données. Vous verrez exactement si la requête sql inclut vos détails de catégorie ou non.

Je connais 2 options pour voir le sql généré. Vous pouvez surveiller votre base de données ou utiliser Mvc Mini Profiler. Si vous utilisez DevArt dotConnect, vous disposez d'un outil de surveillance.

Questions connexes