2010-11-24 11 views
37

Ich habe eine neue Entity Frameworks Code App erstellt und das DbSet (People) gibt null zurück.Warum ist mein DbContext DbSet null?

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

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

web.config: Verbindungszeichenfolge

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

Wenn ich jetzt

Repository _repo = new Repository() 
_repo.People; 

_repo.People wird

Was null nenne ich bin fehlt?

  • Microsoft.Data.Entity.Ctp.dll ist verwiesen
  • Ich habe versucht, mit und ohne Datenbank initializer.

Antwort

54

Das ist, weil Sie ein Feld von DbSet<Person> auf Repository-Klasse anstelle eine Eigenschaft definieren. Sobald Sie eine Eigenschaft hinzufügen oder sie als automatische Eigenschaft ändern, beginnt People Ihnen Werte anstelle von null zu geben. Also alles, was Sie tun müssen, ist Ihre Repository-Klasse zu ändern:

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

WOW! Ich fühle mich dumm! Ich kann nicht glauben, dass ich das nicht gesehen habe, nachdem ich stundenlang darauf gestarrt habe. Danke! –

+0

Sie sind willkommen und keine Sorgen, da automatische Eigenschaften wirklich die gleichen wie Felder aussehen, deshalb verwende ich immer die VS-Verknüpfung * prop *, um sie zu erstellen :) –

+0

Ich habe gerade den gleichen Fehler gemacht. Zwei Stunden lang auf das da * n-Ding gestarrt und dann geklickt ... Das Schlimmste ist, dass Sie einen Fehler über Parameter bekommen: Source ist null, was ein Red Hering ist. – Jim

41

Ich hatte gerade das gleiche Problem. Das Problem war, dass ich diese Eigenschaften als "intern" festgelegt habe, obwohl sie "öffentlich" sein mussten. Nur für den Fall, dass jemand noch sucht :)

+3

Sie haben mir meine Vernunft gerettet !!!! – badMonkey

+0

löste mein Problem auch! –

+5

Wer weiß, warum Sie sie überhaupt auf intern setzen können? –

1

Ich hatte gerade das gleiche Problem. Das Problem war, dass ich diese Eigenschaften als "intern" festgelegt habe, obwohl sie "öffentlich" sein mussten. Nur für den Fall noch jemand ist auf der Suche :)

Ich denke, diese Eigenschaften auch interne/public sein kann, wenn man sie wie folgt verwenden:

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

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