基于.NET的Windows窗体编程之WinForms数据持久化(1)

在实际应用开发中,数据持久化必须掌握的技能,而数据库存储是数据持久化常用的方案之一。随着技术的发展,数据库操作已经不再局限于最初的ADO.NET,ORM以其便捷,简单的操作逐渐成为主流。今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中数据持久化中ORM的相关应用,仅供学习分享使用,如有不足之处,还请指正。

image

 

ORM概述

 

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于将面向对象的编程语言中的对象与关系型数据库中的数据表之间进行映射。ORM可以将数据库中的数据表映射为面向对象的类,通过面向对象的方式来操作数据库,使得开发人员可以更加方便地进行数据持久化操作,同时也减少了手写SQL的工作量。ORM框架通常提供了一系列的API和工具,使得开发人员可以通过面向对象的方式来进行数据库操作,例如查询、插入、更新和删除等操作。ORM框架也可以通过配置文件或注解来定义对象与数据表之间的映射关系,使得开发人员可以更加方便地管理数据模型。ORM减少了手写SQL的工作量,提高了开发效率,同时也隔离了底层数据库的细节,使得开发人员可以更加专注于业务逻辑的实现。且采用ORM框架使得代码更加易于维护和扩展,同时也提高了代码的可读性和可重用性,同时也提高了代码的可移植性和可扩展性。

在.NET体系架构中,常见的ORM框架主要有以下几种:

  1. ‌EF Core‌:EFCore由微软官方出品,主要支持 LINQ 查询、变更跟踪、数据库迁移,且与.NET Core 集成度最高。EFCore适合大多数以 CRUD 为主且模型较复杂的项目。
  2. ‌Dapper‌:Dapper框架是一个微型 ORM,需自己写 SQL,不提供迁移和变更跟踪。适合高并发 API、报表、复杂查询或需要完全掌控 SQL 的场景。
  3. ‌SqlSugar‌:SqlSugar是一款国产ORM框架,中文文档友好,API 简洁,支持多数据库,内置分表、批量操作和 CodeFirst。适合快速开发、对国产数据库有要求的项目。

 

EFCore

 

EF Core(全称Entity Framework Core)是微软开发的轻量级、开源、跨平台对象关系映射(ORM)框架‌,作为 Entity Framework 的演进版本,让.NET 开发者能用 C# 对象直接操作数据库,无需手写大量 SQL 代码。EFCore主要支持的数据库如下所示:

  1. 主流关系型数据库‌:SQL Server、SQLite、MySQL、PostgreSQL、Oracle 。
  2. ‌云数据库服务‌:Azure SQL Database、Azure Cosmos DB for NoSQL 。
  3. ‌其他数据库‌:MariaDB、Firebird、MongoDB 及内存数据库(用于测试)

 

EFCore安装

 

在Visual Studio开发IDE中,可以通过Nuget包管理器进行安装。选择解决方案,并在弹出的右键快捷菜单中选择“管理解决方案的Nuget程序包(N)...”,打开Nuget包管理窗口,在浏览页签进行搜索“EntityFrameworkCore”,然后在搜索到的列表中选择SQL Server对应的扩展程序“Microsoft.EntityFrameworkCore.SqlServer”,当前最新稳定版本为10.0.14,对应.NET10.0开发框架,如果是其他版本的开发框架(如.NET8.0),则可以选择其他稳定版本(如8.0.33),在右侧的项目列表进行选择需要安装的项目,然后点击安装即可,安装成功后,如下图所示:

image

 

EFCore实体模型

 

为了便于管理和扩展,数据库实体模型可以在独立的项目中进行创建,首先创建项目“Okcoder.WinForm.Models”,首先创建BaseModel,用于作为Model的基类,如下所示:

using SqlSugar;

namespace Okcoder.WinForm.Models
{
    public class BaseModel
    {
        public int Id { get; set; }

        public BaseModel()
        {

        }
    }
}

在其中添加Person模型,使其派生自BaseModel,相当于模型类包括Id,Name,Age,Gender四个字段,分别对应数据表中的四列,如下所示:

using SqlSugar;

namespace Okcoder.WinForm.Models
{
    /// <summary>
    /// Person实体
    /// </summary>
    public class Person : BaseModel
    {
        public string Name { get; set; }

        public int Age { get; set; }

        public bool Gender { get; set; }
    }
}

根据约定,模型类中名为 Id 或 <type name>Id 的属性会默认配置为实体的主键,也可以将单个属性以添加Key特性的方式配置为实体的主键。

 

EFCore DbContext

 

DbContext作为EF Core 的核心类,代表一次与数据库的会话,充当应用和数据库之间的桥梁‌。它负责查询数据、跟踪实体变更、调用 SaveChanges 将修改写回数据库,并管理连接与事务。为了方便扩展和应用,首先创建项目“Okcoder.WinForm.ORM”,并在其中创建EFCore文件夹,然后创建OkcoderDbContext,它派生自DbContext,并在重写基类的OnConfiguring方法,在OnConfiguring方法中进行数据库的连接,其参数为数据库连接字符串,具体如下所示:

using Microsoft.EntityFrameworkCore;
using Okcoder.WinForm.Models;

namespace Okcoder.WinForm.ORM.EFCore
{
    public class OkcoderDbContext : DbContext
    {
        public DbSet<Person> Persons { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=localhost;Database=TestDB;Trusted_Connection=True;User Id=sa;Password=123456;Encrypt=True;TrustServerCertificate=True;");
        }
    }
}

在上述方法中,Persons属性与数据库中的Persons表一一对应。

 

创建数据库表

 

在SQL Server数据库中,选择TestDB数据库,并创建Persons数据表,并包含Id,Name,Age,Gender四列,如下图所示:

image

 

EFCore操作数据

 

通过EFCore进行数据查询,可以通过创建OkcoderDbContext上下文实例对象,然后调用Persons属性获取即可,如下所示:

private List<Person> _persons;
public List<Person> Persons
{
    get
    {
        return _persons;
    }
    set
    {
        _persons = value;
    }
}

private void FrmOrmEfcore_Load(object sender, EventArgs e)
{
    dgvData.RowsDefaultCellStyle.BackColor = Color.FromArgb(255, 192, 192);
    dgvData.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(192, 255, 255);
    LoadData();
}

private void LoadData()
{
    using (OkcoderDbContext dbContext = new OkcoderDbContext())
    {
        Persons = dbContext.Persons.ToList();
    }
    this.bindingSource1.DataSource = Persons;
}

 

通过EFCore进行数据插入,可以通过创建OkcoderDbContext上下文实例对象,并调用Persons属性列表的Add方法添加数据,然后调用DbContext的SaveChanges方法,即可保存到数据库,如下所示:

private void SaveData(object o)
{
    Person person = new Person()
    {
        Name = this.txtName.Text,
        Age = int.Parse(txtAge.Text),
        Gender = this.rbGenderBoy.Checked
    };
    using (OkcoderDbContext dbContext = new OkcoderDbContext())
    {
        dbContext.Persons.Add(person);
        int num = dbContext.SaveChanges();
        if (num > 0)
        {
            //如果成功,重新加载数据
            LoadData();
        }
    }
}

 在上述代码中由于Person表的Id是主键,会自动递增,所以创建Person对象时,不需要给Id赋值;SaveChanges方法返回受影响的行数,如果行数大于0,则表示插入成功,然后重新加载数据刷新列表。

 

EFCore实例演示

 

经过上述步骤,已经实现了EFCore的简单操作,左侧DataGrid列表绑定Persons列表,显示Persons列表的详细信息;右侧是Person信息输入框和保存按钮,点击保存按钮时调用SaveData方法进行数据的插入操作,具体实例如下图所示:

 image

 

SqlSugar

 

SqlSugar是一款轻量级、高性能的开源国产ORM框架,由果糖大数据科技团队维护和更新,是开箱即用最易上手的ORM之一。SqlSugar支持主流数据库(MySQL / SQL Server / Oracle / PostgreSQL等),它具有以下特点:

  • 简单易用的 Lambda 表达式查询
  • 强大的分库分表支持
  • 完善的Code-First开发体验
  • 高性能(官方基准测试优于大部分主流ORM)
  • 支持 .NET Framework 4.6+ 和 .NET Core 2.0+

 

SqlSugar安装

 

在Visual Studio中,可以通过Nuget包管理器安装SqlSugar到项目中。首先创建项目“Okcoder.Wpf.Chapter08.SqlSugar”用于封装SqlSugar对数据库的操作。选择解决方案,并在弹出的右键快捷菜单中选择“管理解决方案的Nuget程序包(N)...”,打开Nuget包管理窗口,在浏览页签进行搜索“SqlSugar”,搜索出来两个符合条件的:SqlSugar是基于.NET Framework版本的,SqlSugarCore是基于.NET Core及新版.NET的。由于本示例项目是基于.NET8.0进行开发,所以选择SqlSugarCore进行安装,如下图所示:

image

 

SqlSugar实体模型

 

SqlSugar的实体模型和EFCore共有,在此创建一个实体模型的基类BaseModel,它包含Id属性,并标识Id为主键且自动递增,如下所示:

using SqlSugar;

namespace Okcoder.WinForm.Models
{
    public class BaseModel
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }

        public BaseModel()
        {

        }
    }
}

 

创建Person实体模型类,让Person类派生自BaseModel,且用SugarTable特性指定数据库中表名为Persons,如下所示:

using SqlSugar;

namespace Okcoder.WinForm.Models
{
    /// <summary>
    /// Person实体
    /// </summary>
    [SugarTable("Persons")]
    public class Person : BaseModel
    {
        public string Name { get; set; }

        public int Age { get; set; }

        public bool Gender { get; set; }
    }
}

 

SqlSugar 数据访问

 

数据访问层(Data Access Layer),封装数据库的基础操作,主要用于进行数据表的增删改查等操作。首先封装基类BaseDal,实现数据库的基础操作,且此类不针对具体的数据表来实现,而是通用功能,具体如下所示:

using Okcoder.WinForm.Models;
using SqlSugar;

namespace Okcoder.WinForm.ORM.SqlSugar
{
    /// <summary>
    /// 数据处理基类
    /// </summary>
    public class BaseDal
    {
        private ConnectionConfig _config;

        public BaseDal()
        {
            _config = new ConnectionConfig()
            {
                DbType = DbType.SqlServer,
                ConnectionString = "Server=localhost;Database=TestDB;Trusted_Connection=True;User Id=sa;Password=123456;Encrypt=True;TrustServerCertificate=True;",
            };
        }

        /// <summary>
        /// 查询所有
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public List<T> QueryAll<T>()
        {
            using (SqlSugarClient db = new SqlSugarClient(_config))
            {
                return db.Queryable<T>().ToList();
            }
        }

        /// <summary>
        /// 按ID进行查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        /// <returns></returns>
        public T QueryById<T>(int id) where T : BaseModel
        {
            using (SqlSugarClient db = new SqlSugarClient(_config))
            {
                return db.Queryable<T>().Single(item => item.Id == id);
            }
        }

        /// <summary>
        /// 插入数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool Add<T>(T t) where T : class, new()
        {
            using (SqlSugarClient db = new SqlSugarClient(_config))
            {
                var id = db.Insertable<T>(t).ExecuteReturnIdentity();
                return id > 0;
            }
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool Delete<T>(T t) where T : BaseModel, new()
        {
            using (SqlSugarClient db = new SqlSugarClient(_config))
            {
                var cnt = db.Deleteable<T>().In(t.Id).ExecuteCommand();
                return cnt > 0;
            }
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool Update<T>(T t) where T : class, new()
        {
            using (SqlSugarClient db = new SqlSugarClient(_config))
            {
                var cnt = db.Updateable<T>(t).ExecuteCommand();
                return cnt > 0;
            }
        }
    }
}

 

对于Persons数据表的操作,则创建PersonDal,并派生自BaseDal,具体如下所示:

using Okcoder.WinForm.Models;

namespace Okcoder.WinForm.ORM.SqlSugar
{
    public class PersonDal : BaseDal
    {
        public PersonDal()
            : base()
        {

        }

        public List<Person> QueryPerosns()
        {
            return QueryAll<Person>();
        }

        public Person QueryPersonById(int id)
        {
            return QueryById<Person>(id);
        }

        public bool AddPerson(Person p)
        {
            return Add<Person>(p);
        }

        public bool DeletePerson(int id)
        {
            Person p = new Person()
            {
                Id = id,
            };
            return Delete(p);
        }

        public bool UpdatePerson(Person p)
        {
            return Update(p);
        }
    }
}

 

SqlSugar操作数据

 

通过SqlSugar进行查询数据,只需要创建PersonDal实例对象,然后调用QueryPersons方法即可。具体如下所示:

private List<Person> _persons;
public List<Person> Persons
{
    get
    {
        return _persons;
    }
    set
    {
        _persons = value;
    }
}

private void FrmOrmSqlSugar_Load(object sender, EventArgs e)
{
    dgvData.RowsDefaultCellStyle.BackColor = Color.FromArgb(255, 192, 192);
    dgvData.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(192, 255, 255);
    LoadData();
}

private void LoadData()
{
    PersonDal dal = new PersonDal();
    Persons = dal.QueryPerosns();
    this.bindingSource1.DataSource = Persons;
}

 

保存数据则需要调用PersonDal的AddPerson方法,具体如下所示:

private void SaveData(object o)
{
    Person person = new Person()
    {
        Name = this.txtName.Text,
        Age = int.Parse(txtAge.Text),
        Gender = this.rbGenderBoy.Checked
    };
    PersonDal dal = new PersonDal();

    bool flag = dal.AddPerson(person);
    if (flag)
    {
        //如果成功,重新加载数据
        LoadData();
    }
}

private void btnSave_Click(object sender, EventArgs e)
{
    SaveData(sender);
}

 

SqlSugar实例演示

 

经过上述步骤,已经实现了SqlSugar的简单操作,左侧DataGrid列表绑定Persons列表,显示Persons列表的详细信息;右侧是Person信息输入框和保存按钮,点击保存按钮时调用SaveData方法进行数据的插入操作,具体实例如图8-85所示:

image

以上就是《基于.NET的Windows窗体编程之WinForms数据持久化(1)》的全部内容,希望可以抛砖引玉,一起学习,共同进步!

posted @ 2026-11-10 12:00  老码识途呀  阅读(24)  评论(0)    收藏  举报