1. 简介
Microsoft SQL Server(简称MSSQL)是一个由微软开发的关系型数据库管理系统,它在企业级应用程序中广泛使用。MSSQL具有高可用性、高性能和高安全性等特点,并且提供了多种编程接口,如T-SQL、ADO.NET等。在本文中,我们将介绍一个基于.NET Core的MSSQL框架,它可以提供更强大的开发体验。
2. 框架概述
2.1 架构
这个MSSQL框架采用了典型的三层架构,它将应用程序分为三个层次:表示层、业务逻辑层和数据访问层。下面是这个架构的简单描述:
表示层:这一层是应用程序与用户交互的界面。通常采用Web形式,例如ASP.NET Core Web应用程序。
业务逻辑层:这一层包含应用程序中所有的业务逻辑,例如验证用户输入、处理请求、生成响应等。
数据访问层:这一层处理数据与数据库之间的交互。它通过抽象出数据访问层接口来降低表示层和业务逻辑层与具体数据库的耦合度。
这个MSSQL框架将MSSQL数据库与数据访问层紧密集成,提供了一种方便、高效的方法来管理数据库。
2.2 技术框架
这个MSSQL框架采用了一些.NET Core的技术栈,包括:
ASP.NET Core:用于表示层。
Entity Framework Core:用于数据访问层。它是一个ORM框架,可以简化数据访问层的开发。
Swagger:用于API文档生成。可以方便地查看API的调用方式和返回结果。
3. 数据访问层实现
数据访问层是这个MSSQL框架中最重要的部分,因为它决定了应用程序与MSSQL数据库之间的交互方式。下面我们将介绍这个数据访问层的基本实现思路。
3.1 数据库上下文
首先,我们需要创建一个数据库上下文,它将提供与数据库的交互方式。这个数据库上下文应该与具体的数据库相对应。为了简化这个例子,我们将假设有一个简单的数据库,其中包含一个表。下面是这个数据库的表结构:
CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Age] [int] NOT NULL,
[Gender] [nvarchar](10) NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
使用Entity Framework Core,我们可以定义一个MSSQL数据库上下文。下面是一个名为MyDbContext
的示例。它集成了DbContext
类,包含与Person
表相关的DbSet
。
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions options) : base(options){ }
public DbSet<Person> People { get; set; }
}
在这个MyDbContext
类中,我们需要完成以下工作:
继承DbContext
类。
定义一个构造函数,用于传递连接字符串。在上面的例子中,我们使用了DbContextOptions
来传递连接字符串。
定义一个或多个DbSet
属性,用于表示数据库中的表。
3.2 数据访问
当我们定义好了上下文之后,就可以使用它来访问MSSQL数据库了。在这个MSSQL框架中,我们提供了一个基于Repository
模式和UnitOfWork
模式的通用数据访问层。Repository
表示对单个数据库表的CRUD操作,UnitOfWork
表示对多个Repository
的事务操作。
下面是这个通用数据访问层的代码:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected readonly MyDbContext _context;
private DbSet<TEntity> entities;
public Repository(MyDbContext context)
{
_context = context;
entities = context.Set<TEntity>();
}
public void Add(TEntity entity)
{
entities.Add(entity);
}
public void Delete(TEntity entity)
{
entities.Remove(entity);
}
public IQueryable<TEntity> GetAll()
{
return entities.AsQueryable();
}
public TEntity GetById(int id)
{
return entities.Find(id);
}
public void Update(TEntity entity)
{
entities.Update(entity);
}
}
public class UnitOfWork : IUnitOfWork
{
private readonly MyDbContext _context;
public UnitOfWork(MyDbContext context)
{
_context = context;
}
public void Commit()
{
_context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
public IRepository<TEntity> GetRepository<TEntity>() where TEntity : class
{
return new Repository<TEntity>(_context);
}
}
在这个通用数据访问层中,我们使用了泛型类和依赖注入,使它可以适用于所有的数据库表。这个数据访问层包含以下几个部分:
Repository
:表示一个通用的单表数据访问层,它通过MyDbContext
来访问MSSQL数据库。
UnitOfWork
:表示一个通用的多表数据访问层,它通过Repository
来访问MSSQL数据库并支持事务。
IRepository
和IUnitOfWork
:它们是这两个数据访问层的接口。
使用这个通用数据访问层,我们可以轻松地完成对于Person
表的CRUD操作,例如:
using(var unitOfWork = new UnitOfWork(context))
{
var repository = unitOfWork.GetRepository<Person>();
var person = new Person { Name = "Foo", Age = 18, Gender = "M" };
repository.Add(person);
unitOfWork.Commit();
var savedPerson = repository.GetById(person.Id);
savedPerson.Name = "Bar";
repository.Update(savedPerson);
unitOfWork.Commit();
var updatedPerson = repository.GetById(person.Id);
repository.Delete(updatedPerson);
unitOfWork.Commit();
}
4. API接口
为了方便使用这个MSSQL框架,我们提供了一些API接口,可以用来管理Person
表。
4.1 查询全部
这个API接口可以查询全部Person
信息。
[HttpGet]
public ActionResult<List<Person>> GetAllPeople()
{
using (var unitOfWork = new UnitOfWork(context))
{
var repository = unitOfWork.GetRepository<Person>();
var people = repository.GetAll().ToList();
return Ok(people);
}
}
使用Swagger,我们可以方便地查看API调用方式和返回结果:
4.2 根据ID查询
这个API接口可以根据Person
的ID查询单个人员信息。
[HttpGet("{id}")]
public ActionResult<Person> GetPersonById(int id)
{
using (var unitOfWork = new UnitOfWork(context))
{
var repository = unitOfWork.GetRepository<Person>();
var person = repository.GetById(id);
if (person == null)
return NotFound();
return Ok(person);
}
}
4.3 新建人员
这个API接口可以向Person
表中添加一个新的人员。
[HttpPost]
public ActionResult<Person> AddPerson([FromBody] Person person)
{
using (var unitOfWork = new UnitOfWork(context))
{
var repository = unitOfWork.GetRepository<Person>();
repository.Add(person);
unitOfWork.Commit();
return CreatedAtAction(nameof(GetPersonById), new { id = person.Id }, person);
}
}
4.4 修改人员
这个API接口可以修改Person
表中已有的人员信息。
[HttpPut("{id}")]
public IActionResult UpdatePerson(int id, [FromBody] Person updatedPerson)
{
using (var unitOfWork = new UnitOfWork(context))
{
var repository = unitOfWork.GetRepository<Person>();
var person = repository.GetById(id);
if (person == null)
return NotFound();
person.Name = updatedPerson.Name;
person.Age = updatedPerson.Age;
person.Gender = updatedPerson.Gender;
repository.Update(person);
unitOfWork.Commit();
return NoContent();
}
}
4.5 删除人员
这个API接口可以删除Person
表中指定的人员。
[HttpDelete("{id}")]
public IActionResult DeletePerson(int id)
{
using (var unitOfWork = new UnitOfWork(context))
{
var repository = unitOfWork.GetRepository<Person>();
var person = repository.GetById(id);
if (person == null)
return NotFound();
repository.Delete(person);
unitOfWork.Commit();
return NoContent();
}
}
5. 总结
这个MSSQL框架提供了一种便捷的方式来访问MSSQL数据库,并通过通用数据访问层和API接口来简化开发人员的工作。对于那些在.NET Core应用程序中需要使用MSSQL数据库的开发人员来说,这个框架可以提供更强大的开发体验。