首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【源代码】VB.NET 基于EF6+CodeFirst的SQLite数据库案例,支持加密,免配置文件

【源代码】VB.NET 基于EF6+CodeFirst的SQLite数据库案例,支持加密,免配置文件

作者头像
办公魔盒
发布2025-10-21 13:55:30
发布2025-10-21 13:55:30
1100
举报
文章被收录于专栏:办公魔盒办公魔盒

先养养眼

一,前置说明:System.Data.SQLite 1.0.112.0之后开始,SQLite数据库的免费版本不再支持设置登录密码,所以这里使用最后一版支持密码的版本System.Data.SQLite 1.0.112.1

下载地址已经有大佬准备好了

代码语言:javascript
复制
https://gitee.com/BuLuoPiaoYu/sqlite-helper

二,把下载下来的dll放到项目Libs目录下

三,配置项目生成事件,让程序自动复制x86和x64运行时自动复制到生成目录下,嫌麻烦可以自己手动复制

代码语言:javascript
复制
xcopy $(ProjectDir)Libs\x86\* $(TargetDir)x86\* /e /i /y
xcopy $(ProjectDir)Libs\x64\* $(TargetDir)x64\* /e /y

四,在nuget上引入EF6和SQLite.CodeFirst类库和引用Libs下的三个类库文件

4.1.手动引用libs下的类库

4.2.通过nuget安装前面的两个类库,其实仅需安装SQLite.CodeFirst类库即可,因为他自引用依赖了EntityFramework这个类库,无需多此一举再去引用EntityFramework

五,开始码代码

5.1.创建免配置的文件的配置类SQLiteConfiguration.vb

代码语言:javascript
复制
Imports System.Data.Entity
Imports System.Data.Entity.Core.Common
Imports System.Data.SQLite
Imports System.Data.SQLite.EF6

''' <summary>
''' 配置类
''' </summary>
Public Class SQLiteConfiguration
    Inherits DbConfiguration

    ''' <summary>
    ''' 构造函数
    ''' </summary>
    Public Sub New()
        SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance)
        SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance)
        SetProviderServices("System.Data.SQLite", CType(SQLiteProviderFactory.Instance.GetService(GetType(DbProviderServices)), DbProviderServices))
        SetProviderServices("System.Data.SQLite.EF6", CType(SQLiteProviderFactory.Instance.GetService(GetType(DbProviderServices)), DbProviderServices))
    End Sub
End Class

5.2.配置数据库上下文AppDbContext.vb

代码语言:javascript
复制

Imports System.Data.Common
Imports System.Data.Entity
Imports System.Data.Entity.ModelConfiguration.Conventions
Imports System.Data.SQLite
Imports System.IO
Imports SQLite.CodeFirst

''' <summary>
''' 数据库上下文
''' </summary>
<DbConfigurationType(GetType(SQLiteConfiguration))> '' 引入配置类
Public Class AppDbContext
    Inherits DbContext

    ''' <summary>
    ''' 构造函数
    ''' </summary>
    ''' <param name="connectionString"></param>
    Public Sub New(Optional connectionString As String = Nothing)
        MyBase.New(CreateConnection(connectionString), True)
        '------------
        Configuration.ValidateOnSaveEnabled = False
        Configuration.LazyLoadingEnabled = False
        '------------ 输出SQL日志
        Database.Log = New Action(Of String)(Sub(sql)
                                                 Trace.WriteLine(sql)
                                             End Sub)
    End Sub

    ''' <summary>
    ''' 创建链接对象
    ''' </summary>
    ''' <returns></returns>
    Private Shared Function CreateConnection(connectionString As String) As DbConnection
        If connectionString = Nothing Then
            Dim dbPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DataBase.db3") '' 配置数据库地址
            Dim password As String = "bgmh123456" '' 配置数据库密码
            connectionString = String.Format("Data Source={0};password={1};Version=3;", dbPath, password)
        End If
        Return New SQLiteConnection(connectionString)
    End Function

    ''' <summary>
    ''' 在模型创建时进行模型配置
    ''' </summary>
    ''' <param name="modelBuilder"></param>
    Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
        ' CodeFirst创建数据库和数据表 
        ' 当模型发生变化时,适合开发环境
        Dim sqliteConnectionInitializer = New SqliteDropCreateDatabaseWhenModelChanges(Of AppDbContext)(modelBuilder)
        ' 当数据库不存在时,适合正式环境
        ' Dim sqliteConnectionInitializer = New SqliteCreateDatabaseIfNotExists(Of AppDbContext)(modelBuilder)
        Database.SetInitializer(sqliteConnectionInitializer)
        ' 移除复数表名约定
        modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()
        ' 对模型进行配置
        ModelSQLiteConfiguration(modelBuilder)
    End Sub

    ''' <summary>
    ''' 模型配置
    ''' </summary>
    ''' <param name="modelBuilder"></param>
    Private Sub ModelSQLiteConfiguration(modelBuilder As DbModelBuilder)
        ' 配置User表的CreateTime默认值
        ' modelBuilder.Entity(Of TestTable)() _
        '     .Property(Function(u) u.DateString) _
        '     .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)
    End Sub

End Class

5.3.创建一个测试数据表模型名为 TestUser

代码语言:javascript
复制
Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema
Imports SQLite.CodeFirst

''' <summary>
''' 用户数据表
''' </summary>
Public Class TestUser

    ''' <summary>
    ''' 主键ID自增
    ''' </summary>
    ''' <returns></returns>
    <Key> ''主键
    <DatabaseGenerated(DatabaseGeneratedOption.Identity)> '' 自增ID
    Public Property Id As Integer

    ''' <summary>
    ''' 用户名
    ''' </summary>
    ''' <returns></returns>
    <Unique> ''唯一值
    Public Property Name As String

    ''' <summary>
    ''' 用户密码
    ''' </summary>
    ''' <returns></returns>
    Public Property Password As String

End Class

5.4.然后在数据库上下文中,定义表数据集

代码语言:javascript
复制
 ''' <summary>
 ''' 用户表数据集
 ''' </summary>
 Public Property TestUsers As DbSet(Of TestUser)

六,主要代码码完,下面我们测试一下

6.1.添加数据,运行看看

首次添加

再次添加,报错,为什么?因为我们之前设置Name字段为唯一值,所以报错正常

6.2.查询数据,运行看看效果,嗯,很nice

七,用其他数据库管理工具打开数据库,看看是否已经加密

可以看到报错,说明加密成功,下面我们数据密码看看!

好了,今天的内容到这里了!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 办公魔盒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档