Использование библиотеки классов Entity Framework в приложении без пакета EF - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы использовать мою библиотеку классов EF в консольном приложении.Я создал хранилище в этой библиотеке классов, которое использует DbContext для хранения данных.

Моя цель - использовать этот хранилище в моем консольном приложении без установки пакета Entity Framework.Без этого пакета приложение выдает мне эту ошибку:

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

Когда я устанавливаю пакет EF, он, конечно, работает ...

Может кто-нибудь помочь мне, как я могу достичь своей цели

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Файл app.config для вашей библиотеки содержит настройки времени выполнения.Они не имеют никакого эффекта, потому что настройки времени выполнения должны исходить из конфигурационного файла исполняемого файла.

Просто скопируйте их в app.config вашего исполняемого проекта.

Если вы хотите пойти в обратном направлении, вы можете создать пакет NuGet для вашей библиотеки с помощью скрипта установки, чтобы изменить app.config цели.Таким образом, никому не придется иметь дело с внутренними требованиями библиотеки только для того, чтобы использовать ее в проекте.

0 голосов
/ 26 сентября 2018

Если у вас есть библиотека классов, которая использует классы из другой DLL, например EntityFramework.Dll, то в вашем конечном продукте ваша DLL должна быть в состоянии найти эту другую DLL.

Самый простой способпозаботьтесь об этом, чтобы добавить эту другую DLL к вашим ссылкам.Это автоматически позаботится о том, чтобы после правильного развертывания (установки) была скопирована и другая DLL.

Однако, довольно часто вы не хотите, чтобы пользователи вашей DLL также обращались к другой DLL.К счастью, это не нужно , если вы позаботитесь о том, чтобы ни один из идентификаторов другой DLL не находился в одном из ваших открытых классов / интерфейсов

Так что если вашему классу требуется EntityFramework.DLL,и вы не хотите, чтобы пользователи вашего класса не обращались к EntityFramework.DLL, убедитесь, что ничего из идентификаторов Entity Framework не является общедоступным.

Лучший способ - использовать интерфейсы.Вы также можете попытаться сделать элементы, которые используют Entity Framework внутренними в вашем классе.

Поэтому вместо:

public class DbSchool : DbContext
{
   ...
}

выполните следующее:

public interface IDbSchool
{
    IQueryable<Student> Students {get;}
    IQueryable<Teacher> Teachers {get;}
    IQueryable<ClassRoom> ClassRooms {get;}
    IQueryable<Course> Courses {get;}
}

internal class DbSchool : DbContext, IDbSchool
{
     internal DbSet<Student> Students {get; set;}
     internal DbSet<Teachter> Teachers {get; set;}
     ...

     // Explicit interface implementation of IDbSchool:
     IQueryable<Student> IDbSchool.Students {get => this.Students;}
     IQueryable<Teacher> IDbSchool.Teachers {get => this.Teachers;}
     ...
}

КакПока вы пишете код внутри своей DLL, вы можете использовать все из Entity Framework, в конце концов, ваша DLL ссылается на него.

Пользователи вашей DLL не обращаются к Entity Framework, поэтому они не могут использоватьидентификаторы, такие как DbContext и DbSet.Однако, если они ссылаются на вашу DLL, они могут использовать идентификаторы как Student, Teacher, Course и, конечно, IDbSchool.

Но как мой пользователь создает объект классаDbSchool?

Ответ: он не может.Таким образом, вам нужно создать фабричную функцию, которая возвращает IDbSchool:

public static class SchoolFactory
{
    public static IDbSchool CreateSchoolContext(...)
    {
         return new DbSchool(...);
    }
}

Использование:

using (IDbSchool dbSchool = SchoolFactory.CreateSchoolContext(...))
{
      var teachersWithStudents = dbSchoolTeachers
          .Select(teacher => new
          {
              Id = teacher.Id,
              Name = teacher.Name,
              Students = teacher.Students.Select(student => new
              {
                  Id = student.Id,
                  Name = student.Name,
              })
              .ToList(),
          })
          .Where(teacher => teacher.Students.Any());
}

Примечание: потому что вы хотите правильно утилизировать DbSchool, IDbSchoolдолжен быть получен из IDisposable

public interface IDbSchool, IDisposable {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...