房产cms网站建设,做qq图片的网站吗,自己的网站做防伪码,聊城做网站比较不错的公司一 、什么是EF Core
什么是ORM
1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入:
User user new User(NameadminPassword123”;
orm.Save(user);比如查询:
Book b…一 、什么是EF Core
什么是ORM
1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入:
User user new User(NameadminPassword123”;
orm.Save(user);比如查询:
Book b orm.Books.Single(bb.Id3||b.Name.Contains(.NET));
string bookName b.Name;
string aName b.Author.Name;3、有哪些ORM: EF core(官方推荐)、Dapper、SqlSugar、FreeSql等
EF Core与其他ORM比较
1、Entity Framework Core(EF Coxe)是微软官方的ORM框架优点: 功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异; 缺点: 复杂、上手门槛高、不熟悉EFCore的话可能会进坑。
2、Dapper。优点: 简单N分钟即可上手行为可预期性强; 缺点:生产效率低需要处理底层数据库差异。
3、EF Core是模型驱动(Model-Driven)的开发思想Dapper是数据库驱动(DataBase-Driven)的开发思想的。没有优劣只有比较。
4、性能: Dapper≠性能高; EF Core≠性能差。
5、EF Core是官方推荐、推进的框架尽量屏蔽底层数据库差异.NET开发者必须熟悉根据的项目情况再决定用哪个。
选择
1、个人建议(仅供参考): 对于后台系统、信息系统等和数据库相关开发工作量大的系统且团队比较稳定用EF Core;对于互联网系统等数据库相关工作量不大的系统或者团队不稳定用Dapper 2、在项目中可以混用只要注意EF Core的缓存、Tracking等问题即可。
EF Core与EF比较
1、EF有DB First、ModelFirst、Code First。EF Core不支持模型优先推荐使用代码优先遗留系统可以使用Scaffold-DbContext来生成代码实现类似DBFirst的效果但是推荐用Code First . 2、EF会对实体上的标注做校验EF Core追求轻量化不校验 3、熟悉EF的话掌握EFCore会很容易很多用法都移植过来了。EF Core又增加了很多新东西。 4、EF中的一些类的命名空间以及一些方法的名字在EF Core中稍有不同。 5、EF不再做新特性增加。
搭建 EFCORE 环境
用什么数据库
1、EF Core是对于底层ADO.NET Core的封装因此ADO.NET Core支持的数据库不一定被EF Core支持。 2、EF Core支持所有主流的数据库包括MS SQL Server、Oracle、MySQL、PostgreSQL、SQLite等。可以自己实现Provider支持其他数据库。国产数据库支持问题。3、对于SQLServer支持最完美MySQL、PostgreSQL也不错 (有能解决的小坑) 。这三者是.NET圈中用的最多的三个。本课程主要用SOLServer讲如果用其他数据库只要改行代码绕一些小坑即可大部分代码用法不变。EFCore能尽量屏蔽底层数据库差异。
开发环境搭建
1、经典步骤:建实体类; 建DbContext; 生成数据库; 编写调用EF Core的业务代码。 2、Book.cs
public class Book
{public long Id { get; set; )//主键public string Title { get; set; )//标题public DateTime PubTime { get; set;}//发布日期public double Price { get; set;}//单价
}
3、Install-Package Microsoft.EntityFrameworkCore.SqlServer(这个包依赖了efcore的包所以不需要在单独安装ef的包)
具体实现 新建Book、Person 类 安装程序包
开发环境搭建2
创建实现了IEntityTypeConfiguration接口的实体配置类配置实体类和数据库表的对应关系 Book
class BookEntityConfig:IEntityTypeConfigurationBook
{public void Configure(EntityTypeBuilderBook builder){builder.ToTable(T_Books);}}
Person
class BookEntityConfig:IEntityTypeConfigurationPerson
{public void Configure(EntityTypeBuilderBook builder){builder.ToTable(T_Persons);}}浅谈这里的约定大约配置
1.新建BookConfig类 实现 IEntityTypeConfiguration
列名会根据约定 根据实体类中的数据自动生成 开发环境搭建3
创建继承自DbContext的类
class TestDbContext:DbContext
{// 有哪些实体public DbSetBook Books { get; set; }public DbSetBook Persons { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){//连接数据库string connStr Server.;Databasedemol;Trusted_ConnectionTrue;MultipleActiveResultSetstrue;optionsBuilder.UseSqlServer(connStr);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//从当前程序集加载 上一步中 所有实现 IEntityTypeConfigurationT的类modelBuilder.ApplyConfigurationsFromAssembly(this.GetType()Assembly);}}概念: Migration数据库迁移
面向对象的ORM开发中数据库不是程序员手动创建的而是由Migration工具生成的。关系数据库只是盛放模型数据的一个媒介而已理想状态下程序员不用关心数据库的操作。 根据对象的定义变化自动更新数据库中的表以及表结构的操作叫做Migration (迁移)迁移可以分为多步 (项目进化) 也可以回滚。
开发环境搭建4-Migration
为了使用生成数据库的工具Nuget安装否则MicrosoftEntityFrameworkCore.Tools, 否则执行Add_Migration等命令会如下报错
开发环境搭建4-Migration
1、再在“程序包管理器控制台”中执行如下命令Add-Migration InitialCreate取版本名方便回滚 会自动在项目的Migrations文件夹中中生成操作数据库的C#代码。讲解一下生成代码的作用。InitialCreate是什么? 2、代码需要执行后才会应用对数据库的操作。“程序包管理器控制台”中执行Update-database。 3、查看一下数据库表建好了。
1. 此时项目中多出一个Migrations文件
打开文件查看 此时刷新数据库 发现表已经创建完成 开发环境搭建5-修改表结构
1、项目开发中根据需要可能会在已有实体中修改、新增、删除表、列等。 2、想要限制Title的最大长度为50Title字段设置为“不可为空”并且想增加一个不可为空且最大长度为20的AuthorName(作者名字)属性。 首先在Book实体类中增加一个AuthorName属性 3、修改BookEntityConfig
builder.ToTable(T Books);
builder.Property(e e.Title).HasMaxLength(50).IsRequired();
builder.Property(e e.AuthorName).HasMaxLength(20).IsRequired();4、执行Add-Migration AddAuthorName ModifvTitle。取名字有意义 5、Update-Database
演示:
新增表字段
1.在person中 新建BirthPlace属性 2.执行Add-Migration name
此时Migrations中新生成一个 …AddBirth文件除了日期之外编号更大 查看文件内容
3.验证Update-Database 是编译代码之后在执行故意添加一行错误代码在执行
运行结果 去掉错误代码在执行 运行成功 查看数据库表 添加成功。
修改表字段属性 发现此时该字段允许为空且长度限制为最大程度因为实体类中为String,String 是可以为空得长度也不知道为多少。是不合理得设计。
想要限制Title的最大长度为50Title字段设置为“不可为空”并(作者名字)属且想增加一个不可为空且最大长度为20的AuthorName性。
1.在Person中添加新列
2.修改BookConfig文件
3.新增dog类 为了和Dbcontext产生关系必须加入到 MyDbContext配置类中才能和数据库产生关系
4.执行 【警告】 可能会产生数据丢失原本长度为不限制现在改为不限制
5.继续执行UPdate-Database
6.查看数据库 EFCORE 增删改查
插入数据
1、只要操作Books属性就可以向数据库中增加数据但是通过C#代码修改Books中的数据只是修改了内存中的数据对Books做修改后需要调用DbContext的异步方法SaveChangesAsync0把修改保存到数据库。也有同步的保存方法SaveChanges0但是用EF Core都推荐用异步方法 2、EF Core默认会跟踪(Track)实体类对象以及DbSet的改变。 3、演示数据插入
1.在Main函数中 2.由于myDbContext 继承自DbContext , DbContext实现了 IDisposable 3.所以需要 使用 using 防止资源泄漏
4.执行 数据插入成功
6.多表插入 运行结果
查询数据
1、DbSet实现了IEnumerable接口因此可以对DbSet实施Linq操作来进行数据查询。EF Core会把Linq操作转换为SOL语句。面向对象而不是面向数据库(SQL) 2、ctx.Books.Where(b b.Price 80) Book bl ctx.Books.Single(b b.Title“零基础趣学C语言”); Book b2 ctx.Books.FirstOrDefault(bb.Id9); 3、可以使用OrderBy操作进行数据的排序IEnumerable books ctx.Books.OrderByDescending(b b.Price)
演示 插入初始化数据 数据插入成功 能使用Linq 查询得原因 实现了IEnemerable 接口
查询测试
运行结果 测试二 运行结果
测试三排序 测试结果 去除 10 一下的 【查询】不需要SaveChangesAsync
运行结果 查询数据2
1、GroupBy也可以
var groups ctx.Books.GroupBy(b b.AuthorName)
.Select(g new { AuthorName g.Key,
BooksCount g.Count(),
MaxPrice g.Max(b b.Price));
foreach(var g in groups){Console.WriteLine($作者名:{g.AuthorName},著作数量:{g.BooksCount},最贵的价格:g.MaxPrice});
}
2、大部分Linq操作都能作用于EF Core
示例 运行结果
修改、删除
1、要对数据进行修改首先需要把要修改的数据查询出来然后再对查询出来的对象进行修改然后再执行SaveChangesAsync0保存修改。 var b ctx.Books.Single(bb.Title“数学之美”); b.AuthorName “Jun Wu”; await ctx.SaveChangesAsync)); 2、删除也是先把要修改的数据查询出来然后再调用DbSet或者DbContext的Remove方法把对象删除然后再执行SaveChangesAsync0保存修改。 var b ctx.Books.Single(b b.Title “数学之美”); ctx.Remove(b); //也可以写成 ctx.Books.Remove(b); await ctx.SaveChangesAsync();
示例 运行结果
批量修改、删除
1、目前批量修改、删除多条数据的方法 局限性:性能低:查出来再一条条Update、Delete而不能执行Update … where; delete … where; 2、官方目前还没有支持高效的批量Update、Delete有在后续版本中增加但是目前只是前期意见征询阶段。 3、我实现了一个开源的高效批量修改、删除的开源项目Zack.EFCore.Batch https://github.com/yangzhongke/Zack.EFCore.Batch
await ctx.DeleteRangeAsync(b b.Price n b.AuthorName “zack yang”);
await ctx.BatchUpdate() .Set(b b.Price,b b.Price 3) .Set(b b.Title,b s) .Set(b b.AuthorName, bb.Title.Substring(3,2)b,AuthorName.ToUpper()) .Set(b b.PubTimeb DateTime.Now) .where(b b.Id n ll b.AuthorName.startswith(“Zack”)) .ExecuteAsync0);
示例 把所有价格大于10的书 都上涨1元 运行结果 通过 SQL SEVER Profiler 查看当前数据库接受的所有sql 语句 执行了多次 update 语句 对于数量很大的功能实现性能很差