【Entity Framework】EF中DbSet类详解

简介: 【Entity Framework】EF中DbSet类详解

一、概述

DbSet可用于查询和保存的TEntity实例。针对的DbSet LINQ查询将转换为针对数据库的查询。

可能不会反映上下文中尚未保存到数据库的更改。如:结果将不包含新添加的实体,并且可能扔包含标记为要删除的实体。

根据所使用的数据库,针对DbSet的LINQ查询的某些部分可能在内存中求值,而不是转换为数据库查询。DbSet对象通常从DbSet派生DbContext的或方法Set()上的属性获取。


Entity Framework Core不支持在同一DbContext实例上运行多个并行操作。这包含异步查询的并行执行以及从多个线程进行的任何显示并发使用。

二、定义DbSet

使用Code First工作流进行开发时,可定义一个派生DbContext,用于表示与数据库的会话,并为模型中的每个类型公开一个DbSet。

2.1 具有DbSet属性的DbContext

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

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

当在 Code First 模式下使用时,这会将 Blogs 和 Posts 配置为实体类型,并配置可从此访问的其他类型。 此外,DbContext 会自动调用这些属性的资源库来设置相应的 DbSet 的实例。

2.2 具有 IDbSet 属性的 DbContext

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

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

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

2.3 具有 IDbSet 属性的 DbContext

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

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

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

请注意,DbContext 将缓存从 Set 方法返回的 DbSet 的实例,使每个属性在每次调用时都返回相同的实例。Code First 实体类型的发现工作方式与具有公共 Getter 和资源库的属性的工作方式相同。

三、DbSet属性

序号 属性名 说明
1 EntityType 与此IEnitityType集关联的元数据
2 Local 获取一个,LocalView它表示此集中所有“已添加”、“未更改”和“修改”实体的本地视图。

四、DbSet方法

image.png

五、DbContext动态生成DbSet

平时我们在使用EF的过程中,都是有DbContext中每一个表加一个DbSet,如果我们一个项目有上千个表,就得加上千个DbSet,是很麻烦的一个工程,现在采用一个简单的方法处理,在DbContext类的OnConfiguring方法中加上如下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      var assembly = Assembly.GetExecutingAssembly();
      foreach (Type type in assembly.ExportedTypes)
      {
           if (type.IsClass && type != typeof(EntityBase) && typeof(EntityBase).IsAssignableFrom(type))
           {
                 var method = modelBuilder.GetType().GetMethods().Where(x => x.Name == "Entity").FirstOrDefault();
                 if (method != null)
                 {
                     method = method.MakeGenericMethod(new Type[] { type });
                     method.Invoke(modelBuilder, null);
                 }
            }
        }
        base.OnModelCreating(modelBuilder);
}
目录
相关文章
|
26天前
|
SQL 存储 开发框架
实体框架EF(Entity Framework)简介
实体框架EF(Entity Framework)简介
31 7
|
26天前
|
SQL 开发框架 缓存
【Entity Framework】 EF中DbContext类详解
【Entity Framework】 EF中DbContext类详解
13 0
|
26天前
|
开发框架 .NET 数据库
【Entity Framework】EF中SaveChanges如何使用
【Entity Framework】EF中SaveChanges如何使用
11 0
|
26天前
|
SQL 存储 开发框架
【Entity Framework】EF中的增删改查
【Entity Framework】EF中的增删改查
17 0
|
26天前
|
存储 SQL 开发框架
【Entity Framework】如何使用EF中的生成值
【Entity Framework】如何使用EF中的生成值
14 0
|
26天前
|
存储 SQL API
【Entity Framework】EF中实体属性
【Entity Framework】EF中实体属性
13 0
|
26天前
|
SQL API 数据库
【Entity Framework】EF配置文件设置详解
【Entity Framework】EF配置文件设置详解
12 0
|
26天前
|
SQL API 数据库
【Entity Framework】EF配置之代码配置详解
【Entity Framework】EF配置之代码配置详解
7 0
|
26天前
|
SQL 数据库连接 数据库
【Entity Framework】EF连接字符串和模型
【Entity Framework】EF连接字符串和模型
10 0
|
26天前
|
存储 SQL 开发框架
【Entity Framework】聊一聊EF中继承关系
【Entity Framework】聊一聊EF中继承关系
10 0