Почему мой DbContext DbSet имеет значение null?

Я создал новое приложение Entity Frameworks Code First, и DbSet (People) возвращает значение null.

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

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

web.config: строка подключения

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

Теперь, когда я звоню

Repository _repo = new Repository()
_repo.People;

_repo.People будет нулевым

Что мне не хватает?

  • Ссылка на Microsoft.Data.Entity.Ctp.dll
  • Я пробовал с инициализатором базы данных и без него.

person Jamey McElveen    schedule 24.11.2010    source источник


Ответы (3)


Это потому, что вы определяете поле DbSet<Person> в классе Repository вместо свойства. Как только вы добавите свойство или сделаете его автоматическим, People начнет выдавать вам значения вместо null. Итак, все, что вам нужно сделать, это изменить класс Repository на:

public class Repository : DbContext
{
    public DbSet<Person> People { get; set; }
}
person Morteza Manavi    schedule 24.11.2010
comment
ВАУ! Я чувствую себя глупо! Я не могу поверить, что не видел этого, глядя на него часами. Спасибо! - person Jamey McElveen; 25.11.2010
comment
Добро пожаловать и не беспокойтесь, так как автоматические свойства выглядят так же, как поля, поэтому я всегда использую ярлык VS prop для их создания :) - person Morteza Manavi; 25.11.2010
comment
Я только что сделал ту же ошибку. Вчера смотрел на эту чертову штуку два часа, а затем щелкнул... Хуже всего то, что вы получаете сообщение об ошибке, что параметр: источник равен нулю, что является отвлекающим маневром. - person Jim; 04.02.2011
comment
Я чувствую себя полным идиотом прямо сейчас. Спасибо, спасатель! - person Liam Dawson; 05.07.2011
comment
Я тоже чувствую себя дураком, но в мире снова все хорошо! - person marc; 14.02.2012
comment
Он также может оказаться нулевым, если вы попытаетесь использовать { get; private set; }. ЭФ это не нравится. - person Ryan Lundy; 11.05.2014
comment
Это действительно легко сделать случайно, а затем не замечать в течение нескольких часов. Просто сделал это сам. Рад, что моим первым хитом в Google были эти вопросы и ответы! - person joelmdev; 25.06.2014
comment
Сеттер также не должен быть защищен. Это должно быть общедоступным: { get; set; } - person arni; 31.08.2016
comment
Если источником данных является представление SQL, могу ли я пропустить установщик? - person ARLibertarian; 26.06.2019
comment
Кроме того, модификатор доступа должен быть общедоступным. - person Najeeb; 24.03.2020

У меня была такая же проблема. Проблема заключалась в том, что я установил эти свойства как «внутренние», тогда как они должны были быть «общедоступными». На всякий случай, если кто-то все еще ищет :)

person Martynas    schedule 04.08.2011
comment
кто-нибудь знает, почему вы вообще можете установить их на внутренние? - person Guy Lowe; 30.05.2014

У меня была такая же проблема. Проблема заключалась в том, что я установил эти свойства как «внутренние», тогда как они должны были быть «общедоступными». На всякий случай, если кто-то все еще ищет :)

Я предполагаю, что эти свойства также могут быть внутренними/общедоступными, если вы используете их так:

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

    public Repository()
    {
        //your code here...
        People = Set<Person>();
    }
}
person denisv    schedule 15.12.2015
comment
Это очень умный способ взять лучшее из обоих миров. Спасибо - person Romain Vergnory; 12.04.2019