Definir os DbSets
Ao desenvolver com o fluxo de trabalho do Code First, você define um DbContext derivado que representa sua sessão com o banco de dados e expõe um DbSet para cada tipo em seu modelo. Este tópico aborda as várias maneiras pelas quais é possível definir as propriedades do DbSet.
DbContext com propriedades de DbSet
O caso comum mostrado nos exemplos do Code First é ter um DbContext com propriedades de DbSet automáticas públicas para os tipos de entidade do modelo. Por exemplo:
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Quando usado no modo Code First, isso configurará Blogs e Postagens como tipos de entidade, bem como configurará outros tipos acessíveis a partir deles. Além disso, p dbContext chamará automaticamente o setter para cada uma dessas propriedades para definir uma instância do DbSet apropriado.
DbContext com propriedades de DbSet
Há situações, como ao criar simulações ou falsificações, em que é mais útil declarar suas propriedades definidas usando uma interface. Nesses casos, a interface IDbSet pode ser usada no lugar de DbSet. Por exemplo:
public class BloggingContext : DbContext
{
public IDbSet<Blog> Blogs { get; set; }
public IDbSet<Post> Posts { get; set; }
}
Esse contexto funciona exatamente da mesma maneira que o contexto que usa a classe de DbSet para suas propriedades definidas.
DbContext com propriedades de conjunto somente leitura
Caso não queira expor setters públicos para suas propriedades de DbSet ou IDbSet, poderá criar propriedades somente leitura e criar as instâncias definidas por conta própria. Por exemplo:
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs
{
get { return Set<Blog>(); }
}
public DbSet<Post> Posts
{
get { return Set<Post>(); }
}
}
Observe que o DbContext armazena em cache a instância do DbSet retornada do método Set para que cada uma dessas propriedades retorne a mesma instância sempre que for chamada.
A descoberta de tipos de entidade para o Code First funciona da mesma maneira que ocorre aqui para propriedades com getters e setters públicos.