0x00 前提
由于本人太懒,使用EF时真的懒得写那么多重复的代码。在基于DbFirst的时候,还是希望通过一定的方法就创建简单DbContext。
0x01 使用EF Core Tool
此方法有个前提,就是要先引入Nuget包:
install-package Microsoft.EntityFrameworkCore.Tools
或者对相应的Model项目右键-选择 程序包管理,输入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 结束
其实写这些都只是为了编程更加方便,如果之后有更方便的方法会继续添加。