Поделиться через


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

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

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

Распространенный случай, показанный в примерах кода, заключается в наличии 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 работает так же, как и для свойств с общедоступными методами получения и задания.