ASP.NET Core 使用 SQLite 教程,EF SQLite教程

SQLIte 操作方便,简单小巧,这里笔者就不再过多介绍,感兴趣可以到以下博文

https://blog.csdn.net/qq_31930499/article/details/80420246

 文章介绍创建ASP.NET Core 程序,创建模型、上下文,生成数据库,对数据库增删查改。

并对每个过程进行详细介绍,使初学者尽快了解内容和相关知识,避免对某一知识点怀疑、卡在某个位置。


1 新建ASP.NET Core MVC 应用

1.1 新建MVC应用

打开Visual Studio 2017,新建 ASP.NET Web应用程序,选择 MVC(模型视图控制器)。

 1.2 引入NuGet 包

   需要 引入 

  • microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Sqlite

 引入教程

点击

依赖项

    -右键

       --管理NuGet 程序包

轮流输入并安装 microsoft.EntityFrameworkCore  、 Microsoft.EntityFrameworkCore.Sqlite,下面附过程

注:

版本请选择与自己 ASP.NET Core 版本接近的。

笔者版本 ASP.NET Core 版本为 2.1 ,选择的 NuGet 包版本为 2.11。

如果你的 .Net Core 是最新的,那么 NuGet 也选最新的即可。

如果你选择版本后,发现报错,可以再进入 NuGet  重新删除安装。

出现更新提示千万不用更新。


 2 新建模型和上下文

这一步建立模型和上下文,后面将会根据这里的代码生成数据库和数据库表!

需要建立一个上下文类和模型类,把模型类包含在上下文类中,上下文类中包含进来的模型类,将会生成对应的数据库表。

下面这代码不用自己操作,只需要看就行。(注意红色加粗部分)

复制代码
代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace WebApplication1.Models
{
    public class SqlContext:DbContext
    {
        public SqlContext(DbContextOptions<SqlContext> Options):base(Options)
        {
        }
        public DbSet<A> A { get; set; } //在数据库中生成数据表A
}

public class A
{
    public int ID { get; set; }

      
}
public class B
{
public int ID { get; set; }
}
}

复制代码

上面代码,有三个类,

  • 其中  SqlContext 类是上下文类,
  • A、B类为模型类,
  • 但是,只让A生成数据库表,而B不会生成数据库表。
  • A、B都是模型类,因为可以被生成数据库表,所以A也可以叫实体类,B因为没有 DbSet<B> ,所以B叫模型类,不叫实体类。
  • A类将会生成一个真实的数据库中的表,有对应关系,所以,他是“实体类”。
  • B类没有对应的存在,只是模型,没有实际存在的对象,所以只是叫“模型类”。

2.1 新建模型类

上面代码把模型类、上下文类放到同一个文件 SqlContext.cs,这样可读性不太好。

因为一个模型类,代表一个数据表,上下文类相当于一个配置类,一个数据库有几十个表,每个表有几个列,这样会使文件内容过于复杂。

我们可以降低耦合,每个类文件只存在一个类,每个类代表一个表,你要创建几个表,就对应写几个类。

实际操作

在 Models 文件夹中

  • 新建一个类  Users.cs
  • 在类中直接写代码
代码语言:javascript
复制
        public int ID { get; set; }       //主键
public string Name { get; set; } //用户名称
public int Age { get; set; } //用户年龄
public int Number { get; set; } //用户手机号码

如图

注:

一个模型类  对应 一个数据表(Table)

模型类的一个属性  对应一个列。

模型类只应出现属性,不应该出现方法等。

 笔者这里只写一个表,如果你想要多个表,可以新建其它类,然后在上下文类中加入。

2.2 新建上下文

上面已经建立模型类,模型类将成为数据表(Table)本身。然而他们不能直接对应生成数据表,需要上下文来对模型类映射成数据表,不然他们只是普通的类。

Models 目录新建 类 MyContext.cs

在头部引入 EF( EntityFrameworkCore )

代码语言:javascript
复制
using Microsoft.EntityFrameworkCore;
重写 MyContext

步骤1 

代码语言:javascript
复制
  public class MyContext

改成

public class MyContext:DbContext    //表示该类为上下文类,数据库名称为 My,类名称为什么,数据库名就为什么</code></pre></div></div><p><strong>步骤2</strong></p><p>在MyContext类中写一个构造函数</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">        public MyContext(DbContextOptions&lt;MyContext&gt; options) : base(options)
    {

    }</code></pre></div></div><p>这个构造函数涉及到依赖注入,这里不再赘述,只需要知道这个构造函数能够配置相关设置。</p><p>这里的构造函数内容为空,因为暂时没有什么要配置的。</p><p><strong>步骤3</strong></p><p>在构造函数下面加上代码,对模型类进行映射。</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">        public DbSet&lt;Users&gt; Uaa { get; set; }

//Dbset 映射成一个表
//Dbset<Users> 里面的Users即为使用的模型类
//Uaa Users 类在数据库生成的名称

注:

上面代码表示以模型类Users为基础,在数据库中生成 名为 Uaa 的 表。

一个上下文对应 一个 数据库,上下文类 MyContext,Context 前面的部分将成为数据库名称。例如 asdwadaaContext,将生成数据库asdwadaa。

一个模型类  对应 一个数据表(Table)

完整代码如下

复制代码
代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace WebApplication1.Models
{
public class MyContext:DbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options)
{

    }
    public DbSet&lt;Users&gt; Uaa { get; set; }
}

}

复制代码

生成的效果图预览


3 配置服务

为了让应用生成数据库、使用到这个数据库,需要在 Startup.cs 增加代码

在头部引入三个 库

代码语言:javascript
复制
using WebApplication1.Models;  //可能命名不同
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Sqlite;

然后为 应用注入服务,有以下方式

(后面再解释作用,现在先了解,不用加)

1 直接写字符串

在 Startup.cs 增加代码

代码语言:javascript
复制
            string connecttext = "Filename=F:\MY.DB";
services.AddDbContext<MyContext>(options=>options.UseSqlite(connecttext));

2 使用JSON

在 appsettings.json 文件加入内容(红色部分)

复制代码
代码语言:javascript
复制
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MyContext": "Filename=F:\MY.DB"
}
}
复制代码

然后 在 Startup.cs 增加代码

代码语言:javascript
复制
            string connecttext = Configuration.GetConnectionString("MyContext");
services.AddDbContext<MyContext>(options=>options.UseSqlite(connecttext));

 注:

以上两种方式,connecttext 变量的作用是获取数据库连接字符串,此变量没有特殊意义,只是为了增加可读性。

SQLite的连接字符串,只需要写  "Filename=[绝对路径]"

services.AddDbContext<MyContext>(options=>options.UseSqlite(“连接字符串”));
表示
    向应用注入DbContext (数据库上下文服务),注入的上下文类型为 MyContext>

(options=>options.UseSqlite(“连接字符串”)
是 lambda 表达式,表示使用 sqlite 数据库,参数是连接字符串。Lambda 表达式属于C# 基础知识,不会的话,先记着,以后查找资料。

来实际操作

请使用复制上面 方式一 的代码,然后在 Startup.cs 类 -- ConfigureServices 方法里加入

直接复制下面代码覆盖 ConfigureServerices

复制代码
代码语言:javascript
复制
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
        string connecttext = &#34;Filename=F:\\MY.DB&#34;;
        services.AddDbContext&lt;MyContext&gt;(options =&gt; options.UseSqlite(connecttext));

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }</code></pre></div></div><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:2.56%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179569798400432.gif" /></div><div class="figure-desc">复制代码</div></div></div></figure><p><strong>注:</strong></p><p>SQLite 数据库文件,可以不加后缀名,但加上后缀名会便于别人识别这是一个数据库的文件,后缀名不限,可以为 .DB、.SQLite、SQLite3等。</p><figure class=""><hr/></figure><h3 id="f3kmr" name="4-%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE%E5%BA%93"><strong> 4 生成数据库</strong></h3><p>点击</p><p>  工具</p><p>    -NuGet 包管理器</p><p>      --程序包管理器控制台</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179569961646354.png" /></div></div></div></figure><p>输入</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">Add-Migration InitialCreate</code></pre></div></div><p>等待结束后在输入</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">Update-Database</code></pre></div></div><p>如图</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:58.93%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179570317701046.png" /></div></div></div></figure><p>然后你会发现解决方案管理器,多了 Migrations 目录和一些文件,F:\ 目录也多了一个MY.DB文件</p><figure class=""><hr/></figure><h3 id="ad7hp" name="5-%E4%BD%BF%E7%94%A8%E5%B7%A5%E5%85%B7%E7%AE%A1%E7%90%86SQLite%E6%96%87%E4%BB%B6"><strong>5 使用工具管理SQLite文件</strong></h3><p>生成数据库文件后,会发现无法直接打开的,即使是 VS2017 也不行。</p><p>这时可以使用工具 <strong>SQLite Expert Professional</strong> ,来对 SQLIte 数据库进行管理。</p><p>下载地址 <u>http://xzc.197746.com/SQLiteExpert5.zip</u></p><p>软件介绍 <u>https://www.cr173.com/soft/36343.html</u></p><p>安装好软件后,即可打开数据库文件。</p><p>软件打开数据库文件教程:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:53.19%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179570447281548.png" /></div></div></div></figure><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:93.24%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179570562743828.png" /></div></div></div></figure><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179570642655767.png" /></div></div></div></figure><figure class=""><hr/></figure><h3 id="3u41c" name="6-%E7%94%9F%E6%88%90%E5%A2%9E%E5%88%A0%E6%9F%A5%E6%94%B9%E5%9F%BA%E6%9E%B6"><strong>6 生成增删查改基架</strong></h3><p>这时候可以在程序对数据库进行操作,对于如何使用,最好去看微软的Entity Framework文档。</p><p>笔者这里给出一个简单的示例。</p><p><strong>步骤 1</strong></p><p>在 Controller 目录,右键点击 添加 -- 新建基架的项目</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179570895597119.png" /></div></div></div></figure><p><strong> 步骤 2</strong></p><p>点击 <strong>视图使用 Entity Framework 的 MVC 控制器</strong></p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179571069062201.png" /></div></div></div></figure><p>模型类 选择 <strong>Users</strong>([项目名称]<strong>.Models)</strong></p><p>数据库上下文选择  <strong>MyContext</strong> ([项目名称]<strong>.Models</strong>)</p><p>点击 <strong>添加</strong></p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:76.54%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179571256939640.png" /></div></div></div></figure><p><strong>步骤3 </strong></p><p>这时可以看到</p><p><strong>Controller</strong> 多了 <strong>UsersController.cs</strong> 文件</p><p><strong>Views</strong> 多了 <strong>Users</strong> 目录</p><p>请点击 运行 或按 <strong>F5</strong>,启动网站</p><p> 在网站后面加上 <strong>Users</strong></p><p>例如 <strong>https://localhost</strong>:[实际端口]/<strong>Users,就可以对Users表为所欲为了</strong></p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179571551404083.png" /></div></div></div></figure><p><strong>步骤4  添加数据</strong></p><p>点击 <strong>Create new</strong></p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:79.09%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179571699410630.png" /></div></div></div></figure><p><strong> 结果</strong></p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179572224602861.png" /></div></div></div></figure><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179572319808636.png" /></div></div></div></figure><figure class=""><hr/></figure><h3 id="4rolc" name="7-%E5%A1%AB%E5%86%99%E6%95%B0%E6%8D%AE%E4%B8%8D%E8%83%BD%E4%B8%BA%E7%A9%BA"><strong>7 填写数据不能为空</strong></h3><p>注:这里涉及到特性、数据验证,笔者不再赘述,读者可以先了解,然后翻译别的文章。</p><p>经过上面操作,我们已经可以对数据库进行操作,实际上,虽然可以操作数据,可是如果我想设置某个项必须填写呢,某个项的格式必须是手机呢?总不能让用户随便填吧?</p><p>打开 <strong>Users.cs</strong></p><p>添加引用 </p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">using System.ComponentModel.DataAnnotations;</code></pre></div></div><p>修改Users类的代码如下</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:2.56%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179572464437514.gif" /></div><div class="figure-desc">复制代码</div></div></div></figure><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">    public class Users
{
    public int ID { get; set; }       //主键

    [Required]
    public string Name { get; set; }  /n/用户名称

    [Required(ErrorMessage =&#34;不能为空&#34;)]
    public int Age { get; set; }    //用户年龄

    [Required]
    [RegularExpression(@&#34;^1[3458][0-9]{9}$&#34;, ErrorMessage = &#34;手机号格式不正确&#34;)]
    public int Number { get; set; } //用户手机号码
}</code></pre></div></div><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:2.56%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179572536049262.gif" /></div><div class="figure-desc">复制代码</div></div></div></figure><p>运行网站,打开 URL/Users,点击 Create New,然后不用填写内容直接提交,会发现</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:54.47%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179572600457529.png" /></div></div></div></figure><p>填写其它项,然后在 Number一项乱填数字,会发现</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:76.54%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723179572761211606.png" /></div></div></div></figure><p>这个就是模型验证。</p><p>它不需要写什么代码,只要在属性上面加上 [特性]即可。</p><p>这方面知识,请另外查阅。</p><p><strong>注:</strong></p><ul class="ul-level-0"><li>[Required] 表示该项不能为空</li><li>[Required(ErrorMessage =&#34;不能为空&#34;)] ErrorMessage =&#34;&#34; 就是不按此要求填写,会出现额提示</li><li>[RegularExpression(@&#34;^1[3458][0-9]{9}$&#34;, ErrorMessage = &#34;手机号格式不正确&#34;)] 这是正则表达式验证,填写的内容不符合格式的话,会出现错误提示。</li></ul><p>【完】</p><p>一个逗逗的大学生</p>