2010-11-19 5 views
2

J'utilise EF Code First avec une base de données préexistante.Code EF Premier renvoi d'objets associés

Deux objets:

public Foo 
{ 
    public int FooId {get;set;} 
} 

public Bar 
{ 
    public int BarId {get;set;} 
    public virtual Foo Foo {get;set;} 
} 

Les deux FooId et BarId sont les clés primaires dans la base de données, et la table Bar a une colonne FooId qui est une clé étrangère pointant à la table Foo. Lorsque je sélectionne un Bar, Foo est une référence nulle. J'aurais cru qu'EF les aurait automatiquement séparés, mais peut-être qu'il me manque quelque chose?

applications de base de données:

public class EFCodeFirst : DbContext 
{ 
    public EFCodeFirst() 
    { 
     this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString; 
    } 

    public DBSet<Foo> Foos {get;set;} 
    public DBSet<Bar> Bars {get;set;} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
     modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo"); 
     modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar"); 
    } 
} 
+0

Pouvez-vous également publier votre première correspondance de code? Que se passe-t-il si vous appelez la requête avec Include ("Foo")? –

+0

Si je 'Include (" Foo ")' ça marche. – mattdwen

Répondre

2

Si votre attente de Foo ne devrait pas être nulle vient du fait que vous le faites virtuel sur l'objet Bar, alors ce n'est pas le cas. En les rendant virtuels, il vous suffit d'activer le chargement paresseux d'EF et il sera nul jusqu'au moment où vous le demanderez explicitement en y accédant sur l'objet Bar. Autre que cela, si vous voulez qu'il soit rempli d'avance, vous devez le charger avec Inclure la méthode. Pour désactiver explicitement le chargement paresseux, vous pouvez utiliser le code suivant, même si vous n'en avez pas besoin puisque vous pouvez simplement supprimer le mot-clé virtuel de vos propriétés de navigation et le chargement paresseux aurait disparu.

public EFCodeFirst() 
{   
    this.ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

En interne, DbContext utilise un ObjectContext protégé que vous pouvez également utiliser dans votre classe DbContext héritée (par exemple EFCodeFirst).

+0

Mais de toute façon, il devrait encore résoudre, corriger? Soit avec un appel anticipé ou ultérieur à la base de données. – mattdwen

+0

Je ne peux pas non plus savoir quand désactiver le chargement paresseux. Aucun des objets n'a de référence à 'ContextOptions.LazyLoadingEnabled'. – mattdwen

+0

Oui c'est correct et ça marche. Vous devez nous montrer le code qui ne fonctionne pas. –

0

Il vous manque une ligne dans la classe Foo, que Foo contient une collection de Bar.

+0

Il n'y a actuellement aucun besoin d'accéder aux objets Bar du Foo parent. – mattdwen

+0

Oui, mais c'est ce que dit à EF pour faire la relation, ne pas l'avoir vous donne l'exception de référence nulle –