访问数据库(基本功能)
本篇概述
本篇讨论如何连接数据库,包括连接SQL Server 和 连接MySQL,然后做一些基本的数据操作。
1 连接SQL Server
首先通过NuGet添加相关的包:

新建一个实体类:
public class Product
{
[Key]
public string Code { get; set; }
public string Name { get; set; }
public string Descript { get; set; }
public int Numbers { get; set; }
}
[Key]特性标识表明Code为主键。
新建一个DBContext类
public class SalesContext: DbContext
{
public DbSet < Product > Product
{
get;
set;
}
protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
String connStr = "Server=localhost;Database=Sales;User Id=sales;Password=sales2018;";
builder.UseSqlServer(connStr);
}
}
并在Startup中注册服务
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext < SalesContext > ();
}
}
新建一个Controller,可以进行数据库的操作了
[Produces("application/json")]
[Route("api/products")]
public class ProductsController: Controller
{
private readonly SalesContext _context;
public ProductsController(SalesContext context)
{
_context = context;
}
/// <summary>
/// 获取产品列表
/// </summary>
/// <returns>产品列表</returns>
[HttpGet]
public List < Product > GetAllProducts()
{
List < Product > products = _context.Products.ToList < Product > ();
return products;
}
}
下面把数据库和表建好, 对于SQL Server,采用Windows身份认证登陆后,建数据库Sales和用户sales,进行相应权限设置后,确保可以通过SQL Server Management Studio以SQL Server认证的方式登陆数据库并可以进行数据操作。
数据库建表Product,字段名称、类型和实体类字段名称、类型一致:

数据库建表Product所有实体类的属性在数据库都要有对应字段,但数据库表可以有多余的字段。
数据库建表Product此时应该就可以通过 http://localhost:5000/api/products来查询数据了。
还有两个问题需要处理一下:
- 我们希望在Context中定义的实体DbSet的名称为Products而不是Product,同时希望数据库中对应的表名称为:Base_Product,这样更符合习惯。
public class SalesContext: DbContext
{
public DbSet < Product > Products
{
get;
set;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity < Product > ().ToTable("Base_Product");
}
}
- 我们的数据类连接字符串写在代码里了,需要把它移到配置文件里。
首先清空或删除DbContext类OnConfiguring的方法
protected override void OnConfiguring(DbContextOptionsBuilder builder)
{}
改为在Startup中读取配置文件
public void ConfigureServices(IServiceCollection services)
{
String connStr = Configuration.GetConnectionString("SQLServerConnection");
services.AddDbContext < SalesContext > (builder => builder.UseSqlServer(connStr));
}
配置文件applicatios.json内容如下:
{ "ConnectionStrings": { "SQLServerConnection": "Server=localhost;Database=Sales;User Id=sales;Password=sales2018;" } }
2 连接MySQL
- 增加包引用:

- 修改服务注册代码如下
public void ConfigureServices(IServiceCollection services)
{
String connStr = Configuration.GetConnectionString("MySQLConnection");
services.AddDbContext < SalesContext > (builder => builder.UseMySQL(connStr));
}
配置文件信息如下:
{ "MySQLConnection": "Server=58.220.197.198;port=3317;database=sales;uid=sales;pwd=sales;SslMode=None;" }
因为默认采用SSL连接模式,如果数据库没有提供,需要增加SslMode=None
4 一些基本操作
/// <summary>
/// 产品信息接口
/// </summary>
[Produces("application/json")]
[Route("api/products")]
public class ProductsController: Controller
{
private readonly SalesContext _context;
public ProductsController(SalesContext context)
{
_context = context;
}
/// <summary>
/// 获取产品列表
/// </summary>
/// <returns>产品列表</returns>
[HttpGet]
public List < Product > GetAllProducts()
{
List < Product > products = _context.Products.ToList < Product > ();
return products;
}
/// <summary>
/// 根据产品编号查询产品信息(非模糊查询)
/// </summary>
/// <param name="code">产品编码</param>
/// <returns>产品信息</returns>
[HttpGet("{code}")]
public Product GetProductByCode(String code)
{
Console.WriteLine($ "GetProductByCode:code={code}");
Product product = _context.Products.Find(code);
return product;
}
/// <summary>
/// 新增产品
/// </summary>
/// <param name="product">产品信息</param>
[HttpPost]
public string AddProduct([FromBody] Product product)
{
if(product == null)
{
Console.WriteLine("Add product : null");
return null;
}
Console.WriteLine($ "Add product :{product.Name}");
_context.Products.Add(product);
_context.SaveChanges();
return "success";
}
/// <summary>
/// 删除产品
/// </summary>
/// <param name="code">编码</param>
[HttpDelete("{code}")]
public void Delete(string code)
{
Console.WriteLine($ "Delete product: code={code}");
Product product = _context.Products.Find(code);
if(product != null)
{
_context.Products.Remove(product);
_context.SaveChanges();
}
return;
}
/// <summary>
/// 更新产品信息
/// </summary>
/// <param name="code">产品编码</param>
/// <param name="newproduct">产品信息</param>
[HttpPut("{code}")]
public void Update(String code, [FromBody] Product newproduct)
{
Console.WriteLine($ "Change product ({code}):Name={newproduct.Name}");
Product product = _context.Products.Find(code);
product.Name = newproduct.Name;
_context.SaveChanges();
return;
}
}
5 关于CodeFirst和DBfirst
很多教程都提到CodeFirst和DBfirst的操作,但我在实际使用中没有碰到这个应用场景,正常项目的研发一般都是建一些表写一些代码,再建一些表写一些代码,以此类推,很少有项目是真正把表全部建完再写代码的吧。
版权声明:
本文为智客工坊「seabluescn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
