2010-11-24 3 views
37

J'ai créé une nouvelle application Entity Frameworks Code First et le DbSet (People) retourne null.Pourquoi mon DbContext DbSet est-il nul?

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Repository : DbContext 
{ 
    public DbSet<Person> People; 
} 

web.config: chaîne de connexion

<connectionStrings> 
    <add name="Repository" 
     connectionString="Data Source=|DataDirectory|Repository.sdf" 
     providerName="System.Data.SqlServerCe.4.0"/> 
</connectionStrings> 

Maintenant, quand je l'appelle

Repository _repo = new Repository() 
_repo.People; 

_repo.People sera nulle

Ce que je suis absent?

  • Microsoft.Data.Entity.Ctp.dll est référencé
  • J'ai essayé avec et sans une base de données initialiseur.

Répondre

54

C'est parce que vous définissez un champ de DbSet<Person> sur la classe au lieu d'un dépôt propriété. Une fois que vous ajoutez une propriété ou que vous la modifiez pour devenir une propriété automatique, People commencera à vous donner des valeurs au lieu de null. Donc tout ce que vous devez faire est de changer votre classe Repository à:

public class Repository : DbContext 
{ 
    public DbSet<Person> People { get; set; } 
} 
+1

WOW! Je me sens stupide! Je ne peux pas croire que je ne l'ai pas vu après l'avoir regardé pendant des heures. Je vous remercie! –

+0

Vous êtes les bienvenus et pas de soucis puisque les propriétés automatiques sont vraiment les mêmes que les champs, c'est pourquoi j'utilise toujours le raccourci VS * prop * pour les créer :) –

+0

Je viens de faire la même erreur. J'ai regardé la chose da * n pendant deux heures hier, puis j'ai cliqué ... Le pire, c'est que vous obtenez une erreur sur le paramètre: source étant null, ce qui est un hareng rouge. – Jim

41

J'ai juste eu le même problème. Le problème était que j'avais défini ces propriétés comme «internes» alors qu'elles devaient être «publiques». Juste au cas où quelqu'un est toujours à la recherche :)

+3

vous m'avez sauvé ma santé mentale !!!! – badMonkey

+0

a résolu mon problème aussi! –

+5

quelqu'un sait pourquoi vous pouvez les mettre à l'interne du tout? –

1

J'ai juste eu le même problème. Le problème était que j'avais défini ces propriétés comme «internes» alors qu'elles devaient être «publiques». Juste au cas où quelqu'un est toujours à la recherche :)

Je suppose que, ces propriétés peuvent être trop interne/publique, si vous les utilisez comme ceci:

public class Repository : DbContext 
{ 
    internal DbSet<Person> People { get; set; } 

    public Repository() 
    { 
     //your code here... 
     People = Set<Person>(); 
    } 
} 
Questions connexes