О DbSet и DbContext

Я видел фрагмент кода, который смешивает DbSet и DbContext вместе. Я не силен в Entity Framework. Я думал, что это разные вещи.

Может кто-нибудь дать мне небольшое объяснение?

public class testContext : DbContext
{
    public testContext();

    public string IPAddress { get; set; }
    public DbSet<WSettings> Settings { get; set; }
    public string UserName { get; set; }

    public override int SaveChanges();
}

Ответ 1

Интуитивно, DbContext соответствует вашей базе данных (или коллекции таблиц и представлений в вашей базе данных), тогда как DbSet соответствует таблице или представлению в вашей базе данных. Поэтому имеет смысл, что вы получите комбинацию обоих!

Вы будете использовать объект DbContext для доступа к вашим таблицам и представлениям (который будет представлен DbSet), и вы будете использовать свой DbSet для доступа, создания, обновления, удаления и изменения данных таблицы.

Если у вас есть 10 таблиц в вашей базе данных, и ваше приложение работает с 5 из них (назовем их Table1 - Table 5), имеет смысл получить к нему доступ, используя объект MyAppContext, где класс MyAppContext определяется следующим образом:

public class MyAppContext : DbContext
{
    public MyAppContext () : ;

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }
    public DbSet<Table3> Table3 { get; set; }
    public DbSet<Table4> Table4 { get; set; }
    public DbSet<Table5> Table5 { get; set; }
}

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

public class Table1 
{
   public int Id {get; set;}
   public string AStringField {get; set;}
   //etc.
}

За дополнительной информацией обращайтесь к http://entityframeworktutorial.net/

Ответ 2

DbContext обычно представляет соединение с базой данных и набор таблиц. DbSet используется для представления таблицы.

Ваш образец кода не соответствует ожидаемому шаблону. Во-первых, он неполный. Кроме того, есть свойства, которые действительно не принадлежат.

Этот шаблон более типичен:

class User
{
   public string IPAddress { get; set; }
   public ICollection<Settings> Settings { get; set; }
   public string UserName { get; set; }
}

class MyContext : DbContext
{
   public DbSet<User> Users { get; set; }
   public DbSet<Settings> Settings { get; set; }
}