----------简述 EF框架的使用-----------
EF简单来讲是对象关系映射程序。O/RM,Object/Rlation Mapping。
也就是将数据库中的内容映射到程序中的对象集合,通过访问对象便可以访问到数据库中的数据,省去了大量的底层访问代码。
数据库和对象集合
数据库中关系是 : 实例 → 数据库(DataBase) → 表格(table) → 列(column)
对象集合有两个概念 : 数据库上下文(DbContext) → 实体类(Entity Class)
一个实体类对象就相当于一列,一条记录,里面的每个属性对应列属性;
多个实体类对象的集合就相当于一个表格;
多个实体类对象集合存放在数据库上下文中。
EF的使用
我使用的是从代码中生成数据库,也就是在代码中指定数据库的各种表格形式。
还有根据数据库生成代码。
1. 需要使用 Nuget 获取三个包,我访问的是VS SQL
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
EntityFrameworkCore
EF框架主体程序包,使用记得要加上using
EntityFrameworkCore.SqlServer
这个是用于让EF框架能够访问sql数据库的补充包,官方说法叫DataBaseProvider,microsoft提供了很多的数据库访问包。
比如InMomery,sqlite等,可以到官网查看:
EntityFrameworkCore.Tools
这是用来创建数据库和迁移数据库使用到的包,下面会有提及。
2.创建实体类和数据库上下文类
实体类:
导航属性 : 导航属性包含的不是自身记录的属性,而是外键的属性或者是自身被引用,引用者的集合。
public class Blog
{
public int BlogId { get; set; } //以ID结尾的会被认为是主键ID或者是外键ID
public string Url { get; set; } //普通属性
public List<Post> Posts { get; } = new List<Post>(); //导航属性,引用者的集合
}
public class Post
{
public int PostId { get; set; } //主键
public string Title { get; set; } //普通属性
public string Content { get; set; } //普通属性
public int BlogId { get; set; } //外键
public Blog Blog { get; set; } //导航属性
}
数据库上下文类
简而言之 :实体类对象的集合.
有两种配置数据库上下文的方法:
1.一种是使用下面的OnConfiguring,在里面使用options.UseXXX(); XXX看你连接的是什么数据库。
PS : OnConfiguring可以使用判断来作为默认配置, options.IsConfigured可以判断是否已经配置过了,第二种方法会置位这个标志位。
using Microsoft.EntityFrameworkCore;
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; } //实体类的集合,就相当于一个表格
public DbSet<Post> Posts { get; set; } //实体类的集合
protected override void OnConfiguring( DbContextOptionsBuilder options) => options.UseSqlServer(这里填入连接字符串);
//@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=dataBase;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
//连接字符串,要注意的是initial Catalog必须填写
}
2.第二种
//在上下文头部定义
public BloggingContext(DbContextOptions<BloggingContext> options) : base(options){ }
//在外部调用的时候
var optionBuider = new DbContextOptionsBuilder();
var options = optionBuider.UseSqlServer("连接字符串").Options;
using (var db = new BloggingContext ( options ));
3.配置模型
配置模型有两种方法:
1.fluent API
在派生上下文中覆写 OnModelCreating 方法,并使用 ModelBuilder API 来配置模型。 此配置方法最为有效,并可在不修改实体类的情况下指定配置。 Fluent API 配置具有最高优先级,并将替代约定和数据注释。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>() //选择实体类
.Property(b => b.Url) //选择属性
.IsRequired(); //添加属性指定
}
2. 使用数据注释配置模型
public class Blog {
public int BlogId { get; set; }
[Required]
public string Url { get; set; }
}
//常用注释
//[Key] 主键
//[Required] 必须值
// [MaxLength(500)] 最大长度
4. 创建数据库
创建数据库使用到的是迁移:
简单介绍一下 EF的迁移:
在开发的期间,数据模型有可能发生更改并与数据库不同,使用迁移进行同步:
比如你在一个实体类中添加了一个新的属性,这个属性在数据库并不存在,使用迁移,使得模型和数据库同步。
在定义了模型之后,在数据库实例中并不存在对应的数据库和表格,使用迁移进行数据库的创建。
在这里使用到上面添加的包"tools",在包管理器控制台中使用下面命令:
Add-Migration InitialCreate //生成迁移文件,InitialCreate是这次迁移的命名,会在文件中体现出来,命名尽量靠近迁移目的。
Update-Database //执行最近的迁移,执行完毕就可以在数据库中查到对应的表格。
//如果项目中有多个上下文类 ,要在 上面两个命令后面加上 -Context ContextName 以指明对谁使用迁移
//上下文类 BlogiingContext,那 Add-Migration InitialCreate -Context BlogiingContext 指明对BlogiingContext创建迁移
Remove-Migration //回退未执行的迁移
Update-Database LastGoodMigration //回退已经执行的迁移
5.访问数据库的方法
using (var db = new BloggingContext()) 当创建上下文且读取的时候就会自动访问数据库获取对象
{
// Create
Console.WriteLine("Inserting a new blog");
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();
// Read
Console.WriteLine("Querying for a blog");
var blog = db.Blogs .OrderBy(b => b.BlogId) .First();
// Update
Console.WriteLine("Updating the blog and adding a post");
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add( new Post { Title = "Hello World", Content = "I wrote an app using EF Core!" });
db.SaveChanges();
// Delete
Console.WriteLine("Delete the blog");
db.Remove(blog); db.SaveChanges();
}