Bootstrap

EF技巧(1)-创建DbContext

0x00 前提

由于本人太懒,使用EF时真的懒得写那么多重复的代码。在基于DbFirst的时候,还是希望通过一定的方法就创建简单DbContext。

0x01 使用EF Core Tool

此方法有个前提,就是要先引入Nuget包:

install-package Microsoft.EntityFrameworkCore.Tools

或者对相应的Model项目右键-选择 程序包管理,输入Microsoft.EntityFrameworkCore.Tools
安装Microsoft.EntityFrameworkCore.Tools
安装成功后
在 程序包管理器控制台 中
程序包管理器控制台
输入以下命令:
Scaffold-DbContext “Server=(localdb)\mssqllocaldb;Database=DBName;Trusted_Connection=True;” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

简单解释一下

参数描述
-Connection <String>数据库连接串,必填参数
-Provider <String>Database Provider,通常来说这是Nuget包的名称,例如Microsoft.EntityFrameworkCore.SqlServer。必填参数
-OutputDir <String>放文件的目录,路径是基于选择的项目下的路径。 非必填参数
-ContextDir <String>放DbContext文件的目录,路径是基于选择的项目下的路径。非必填参数
-Context <String>生成DbContext类时的类名。非必填参数
-Schemas <String[]>要为其生成实体类型的表的模式。 如果省略此参数,则包括所有模式。
-Tables <String[]>为其生成实体类型的表。 如果省略此参数,则包括所有表。
-DataAnnotations使用属性来配置模型(如果可能)。 如果省略此参数,则仅使用流畅的API。
-UseDatabaseNames完全按照在数据库中显示的方式使用表名和列名。 如果省略此参数,则更改数据库名称以使其更符合C#名称样式约定。
-Force覆盖已存在的文件

参考文章:EF Core Tool 引用

此方法的相关问题:相关问题

0x02 动态创建DbSet

参考地址:动态生成DbSet
由于这个方法并非本人原创的,先放个链接。
因此我先说下引用这个方法的主要原因,因为我们创建DbContext时要创建的DbSet是基于表的数量,如果表数量超过20个还需要自己逐个写DbSet就比较麻烦。
因此,该方法依旧需要手动创建DbContext,在OnModelCreating中使用了反射的方式,主动创建DbSet

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);
}

0x03 结束

其实写这些都只是为了编程更加方便,如果之后有更方便的方法会继续添加。

;