EF6 - Почему все мои DbSets выдают InvalidOperationException при их перечислении? - PullRequest
0 голосов
/ 26 февраля 2019

Я немного сбит с толку из-за того, что мне не хватает в конфигурациях или что-то, что ставит этот камень на моем пути.

Что я пытаюсь сделать? Мой оригинальный тестовый случай был просточтобы получить коллекцию, .ToList (), а затем передать это API.Ваш довольно стандартный запрос EF.

Код

using (var _dbContext = new FooContext())
            {
                ICollection<Location> locationItems = _dbContext.Locations.ToList();
                return locationItems;
            }

Я действительно не чувствую, что это необходимо, но это все, что вращается вокруг.

Что такое мойвыпуск?

Это тот момент, когда он перестает иметь смысл для меня и дает мне четкие указания на то, что на заднем плане что-то упущено.Скорее всего, это очень простой блок конфигурации или настройки.Когда я пытаюсь .ToList () в своих Locations или перечислять их с помощью отладчика (на самом деле тоже самое), я получаю «InvalidOperationException» в каждой коллекции, которую знает мой _dbContext.

Позвольте мне исключить очевидные вопросы, Время вопросов и ответов.

Q: Это даже связано с вашей базой данных?

A: Да, _dbContext.Database.Exists () возвращает мне true , проверка _dbContext.Database с помощью отладчика также дает мне много соответствующей информации, подтверждающей контакт с сервером SQL, с которым я пытаюсь связаться.

В: Есть ли данные вваша база данных SQL?

A: Да, много.Проверено с помощью SSMS.

В: Ваш DbContext даже знает эти Коллекции?

A: Я верю в это?

public class FooContext : DbContext
    {
        public FooContext() : base("name=FooDB")
        {
        }

        public DbSet<Car> Cars { get; set; }
        public DbSet<FooEntry> FooEntries { get; set; }
        public DbSet<ContactDetails> ContactDetails { get; set; }
        public DbSet<Country> Countries { get; set; }
        public DbSet<Equipment> Equipment { get; set; }
        public DbSet<FuelType> FuelTypes { get; set; }
        public DbSet<Location> Locations { get; set; }
        public DbSet<Meeting> Meetings { get; set; }
        public DbSet<Option> Options { get; set; }
        public DbSet<Person> Persons { get; set; }
        public DbSet<VehicleType> VehicleTypes { get; set; }

        // force any DateTime fields to be DateTime2
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties<DateTime>()
                .Configure(c => c.HasColumnType("datetime2"));
        }

    } 

Кроме того, я, вероятно, должен указать, что я выполняю несколько более сложных операций в другом проекте, когда я импортирую / загружаю данные из Sharepoint в БД. Все это работает.

Предоставление контекста относительно того, как примерно выглядит моя структура решения:

  • Несколько проектов с определенными проблемами
  • Foo.EntityFramework содержит конфигурацию FooContext, Migrations и т. Д., Ваш материал EF.
  • Foo.DomainClasses - это классы, на которых EntityFramework основывает всю свою структуру на
  • Foo.Dao.Impl, содержащей конкретныйобъекты для CRUD.<- код здесь </li>
  • Foo.SharepointImporter - проект, который использует EntityFramework _dbContext для выполнения CRUD, все работает, хотя и не использует Foo.Dao.Impl.

Дайте мне знать, если вам нужна дополнительная информация, чтобы сделать обоснованное предположение, что здесь происходит не так.

Запросы на комментарии:

  1. @ mjwills: "Достигается ли точка останова для «return locationItems»? - Нет, это происходит в строке с .ToList ()

  2. @ DavidG: «Что такое полное исключение?» - {«НетОбнаружен поставщик Entity Framework для поставщика ADO.NET с инвариантным именем «System.Data.SqlClient».Убедитесь, что поставщик зарегистрирован в разделе «entityFramework» конфигурационного файла приложения.См. http://go.microsoft.com/fwlink/?LinkId=260882 для получения дополнительной информации. "} - Я чувствую себя немного глупо сейчас, когда сам не углубился в это Исключение, это выглядит очень многообещающе.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вам не нужно устанавливать Entity Framework на Foo.WebService, вам просто нужно добавить ссылку на EF на Foo.WebService.Проверьте этот ответ и этот ответ для более подробной информации.

0 голосов
/ 26 февраля 2019

Проблема заключалась в том, что app.config / web.config не содержал необходимой конфигурации для EntityFramework (по какой причине).

Как указано / подтверждено @ er-sho во всех проектах, которые используют EntityFrameworkнужна ссылка на него.Лучше всего выполнить Install-Package EntityFramework в указанных проектах, что должно автоматически генерировать ссылки между проектами.


Объяснение, почему это не дубликат Не найден поставщик Entity Framework дляпоставщик ADO.NET с именем-инвариантом System.Data.SqlClient :

Исходное состояние:

+----------------------+----------------------------+
|       Project        | EntityFramework installed? |
+----------------------+----------------------------+
| Foo.WebService       | no                         |
| Foo.Dao.Impl         | no                         |
| Foo.EntityFramework  | yes                        |
+----------------------+----------------------------+

Результат:

  • Не найден поставщик Entity Framework для поставщика ADO.NET с инвариантным именем «System.Data.SqlClient».Убедитесь, что поставщик зарегистрирован в разделе «entityFramework» файла конфигурации приложения.

  • Dao.Impl отсутствует конфигурация EntityFramework.


После добавления EntityFramework в мой слой DAO:

+----------------------+----------------------------+
|       Project        | EntityFramework installed? |
+----------------------+----------------------------+
| Foo.WebService       | no                         |
| Foo.Dao.Impl         | yes                        |
| Foo.EntityFramework  | yes                        |
+----------------------+----------------------------+

Результат:

  • То же исключение, что и раньше, что на первый взгляд кажется странным.
  • Dao.Impl теперь имеет правильную конфигурацию в app / web.config, но поскольку WebService является стартовым проектом, ему все еще не хватает необходимой конфигурации.

+----------------------+----------------------------+
|       Project        | EntityFramework installed? |
+----------------------+----------------------------+
| Foo.WebService       | yes                        |
| Foo.Dao.Impl         | yes                        |
| Foo.EntityFramework  | yes                        |
+----------------------+----------------------------+

Результат:

  • Когда запускается Foo.WebService, он читает app.config, предоставляя EntityFramework необходимую информацию.
  • Рабочий код.

Я надеюсь, что это поможет кому-то в будущем с той же проблемой.

Я благодарю всех за их время, которое прокомментировало и направило меня к решению.

...