Entity Framework core

----------简述 EF框架的使用-----------

EF简单来讲是对象关系映射程序。O/RM,Object/Rlation Mapping。

也就是将数据库中的内容映射到程序中的对象集合,通过访问对象便可以访问到数据库中的数据,省去了大量的底层访问代码。

microsoft EF概述

microsoft EF入门


数据库和对象集合

数据库中关系是 : 实例 → 数据库(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等,可以到官网查看:

microsoft 数据提供程序

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.配置模型

Microsoft 配置模型

配置模型有两种方法:

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)] 最大长度


microsoft 待看


4. 创建数据库

创建数据库使用到的是迁移:

microsoft EF迁移

简单介绍一下 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();

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容