Определение наборов dbSets

При разработке программ с использованием подхода Code First вы определяете производный DbContext, который представляет ваш сеанс с базой данных и предоставляет DbSet для каждого типа в вашей модели. В этом разделе рассматриваются различные способы определения свойств DbSet.

DbContext со свойствами DbSet

Распространенный случай, показанный в примерах Code First, заключается в использовании DbContext с общедоступными автоматически создаваемыми свойствами DbSet для типов сущностей вашей модели. Рассмотрим пример.

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

При использовании в режиме Code First это позволит настроить блоги и публикации как типы сущностей, а также настроить другие типы, доступные от них. Кроме того, DbContext автоматически вызывает сеттер для каждого из этих свойств, чтобы установить экземпляр соответствующего DbSet.

DbContext с IDbSet-свойствами

Существуют ситуации, например при создании макетов или поддельных элементов, где более полезно объявить свойства набора с помощью интерфейса. В таких случаях интерфейс IDbSet можно использовать вместо DbSet. Рассмотрим пример.

public class BloggingContext : DbContext
{
    public IDbSet<Blog> Blogs { get; set; }
    public IDbSet<Post> Posts { get; set; }
}

Этот контекст работает точно так же, как и контекст, использующий класс DbSet для его свойств набора.

DbContext с свойствами набора только для чтения

Если вы не хотите предоставлять открытые сеттеры для свойств DbSet или IDbSet, можно создать свойства только для чтения и самостоятельно создать экземпляры сетов. Рассмотрим пример.

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs
    {
        get { return Set<Blog>(); }
    }

    public DbSet<Post> Posts
    {
        get { return Set<Post>(); }
    }
}

Обратите внимание, что DbContext кэширует экземпляр DbSet, возвращаемый методом Set, чтобы каждый из этих свойств возвращал один и тот же экземпляр при каждом вызове.

Обнаружение типов сущностей для Code First работает так же, как и для свойств с общедоступными методами получения и задания.