定义 DbsetDefining DbSets

使用 Code First 工作流进行开发时,可定义一个派生 DbContext,用于表示与数据库的会话,并为模型中的每个类型公开一个 DbSet。 本主题介绍可用于定义 DbSet 属性的各种方式。

具有 DbSet 属性的 DbContextDbContext with DbSet properties

Code First 示例中所示的常见情况是,对于模型的实体类型,DbContext 具有公共自动 DbSet 属性。 例如:

  1. public class BloggingContext : DbContext
  2. {
  3. public DbSet<Blog> Blogs { get; set; }
  4. public DbSet<Post> Posts { get; set; }
  5. }

当在 Code First 模式下使用时,这会将博客和公告配置为实体类型,并配置可从此访问的其他类型。 此外,DbContext 会自动为每个属性调用 setter,以设置相应 DbSet 的实例。

具有 IDbSet 属性的 DbContextDbContext with IDbSet properties

在某些情况下,例如创建模拟或 fakes 时,使用接口来声明集属性更有用。 在这种情况下,可以使用 IDbSet 接口代替 DbSet。 例如:

  1. public class BloggingContext : DbContext
  2. {
  3. public IDbSet<Blog> Blogs { get; set; }
  4. public IDbSet<Post> Posts { get; set; }
  5. }

此上下文的工作方式与使用 DbSet 类作为其设置属性的上下文完全相同。

具有只读 set 属性的 DbContextDbContext with read-only set properties

如果你不希望为 DbSet 或 IDbSet 属性公开公共资源库,则可以改为创建只读属性并自行创建集实例。 例如:

  1. public class BloggingContext : DbContext
  2. {
  3. public DbSet<Blog> Blogs
  4. {
  5. get { return Set<Blog>(); }
  6. }
  7. public DbSet<Post> Posts
  8. {
  9. get { return Set<Post>(); }
  10. }
  11. }

请注意,DbContext 将缓存从 Set 方法返回的 DbSet 的实例,使每个属性在每次调用时都返回相同的实例。

Code First 的实体类型的发现的工作方式与使用公共 getter 和 setter 的属性相同。