🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
1.前言
hi,大家好,我是三合。作为一名程序猿,日常开发中,我们在接到需求以后,一般都会先构思一个模型,然后根据模型写实体类,写完实体类后在数据库里建表,接着进行增删改查, 也有第二种情况,就是有些人喜欢先在数据库里建表,然后再添加实体类。前者是code First,后者是db First,如果数据库表和c#实体类可以互相转换的话,那么无疑将大大加快我们的开发速度,很幸运的是,当前依靠一些第三方建模软件或者是efcode就可以实现,我们以ef core举例,
1.1 ef core根据实体类生成数据库表
//先定义一个我们自己的dbcontext
public class SqlServerDb : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionString = MyConfiguration.GetConfiguration("sqlServerDbConnectionString");
if (string.IsNullOrWhiteSpace(connectionString))
{
throw new ArgumentNullException("sqlServer connectionString must not be null");
}
optionsBuilder.UseSqlServer(connectionString);
}
public DbSet Customer { get; set; }
}
//然后在代码里这样调用
using (var database = new SqlServerDb())
{
database.Database.EnsureCreated();
}
那么efcore就会自动替我们生成一个数据库,库里面有一张表叫做Customer。整个过程无须我们手动干预。接着如果实体类有变更的话,也可以通过add-migration指令进行迁移。
1.2 ef core根据数据库表生成实体类
通过nuget安装了Microsoft.EntityFrameworkCore,Microsoft.EntityFrameworkCore.SqlServer,Microsoft.EntityFrameworkCore.Tools,Microsoft.VisualStudio.Web.CodeGeneration.Design这几个包之后,我们就可以在"程序包管理器控制台"中执行以下语句生成实体类:
Scaffold-DbContext "Data Source=192.168.12.34;Initial Catalog=数据库名称;User ID=登录名;Password=密码" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force
1.3 ef core互相转换存在的一些缺陷
在我使用这种方式的过程中,发现了ef core的几个缺点。
- 当整个解决方案下,子项目比较多时,我要在程序包管理器控制台以及各个项目的切换上花费很多时间才能顺利执行命令,这就很麻烦。
- 我无法快速的获取某个实体类的建表语句(比如我希望只是生成sql,但不执行迁移),以及快速的从数据库表生成某个实体类(ef core可以自定义的根据表的集合生成指定的实体类,但是在项目中已存在该实体类的情况,要