本文介绍如何在SqlServer上创建一个新的数据库。项目便用VS2022编辑器,运行在.Net6 Asp.Net Core WebApi项目模板中,数据库程序运行在阿里云服务器的Windows Server2019中,使用的是SqlServer2022版本,EntityFrameworkCore的版本为6.0.25,数据库显示程序为SQL Server Management Studio19.1。采用CodeFirst创建数据库,即先有代码数据结构,再有数据库。
建议新建一个.Net6 Web Api项目作为测试,并且项目命名、文件夹命名、文件命名都和我一样,否则会出现各种问题。没有搭建数据库程序的请先看博客:在服务器(Window Server 2019)上安装SQL Server数据库。
查看你安装SqlServer程序的公网IP地址,如果安装在本地则不用看了,我的是在阿里云控制台里显示的。
确保你安装了SqlServer程序在一台电脑上,并使用用户名密码可以在SQL Server Management Studio中成功连接数据库。如图所示为连接成功:
打开VS2022,新建一个.Net6 Asp.Net Core WebApi项目。
项目名为:test_EFCore
建议和我一样
使用.Net6,点击创建。
右键项目,点击”管理NuGet程序包“。
在浏览中找到这两个包:需要安装6.0.x版本的,要和你的.Net版本对应。你是.Net8,就安装8.0.x版本的。
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
安装Microsoft.EntityFrameworkCore.SqlServer6.0,要和你的.Net版本对应。
安装Microsoft.EntityFrameworkCore.Tools6.0,要和你的.Net版本对应。
新建文件夹:Entities
在这个文件夹里新建两个cs文件:Product.cs、ProductCategory.cs。
这两个文件对应了数据库的两个表,名称为“Id”的属性会被EFCore识别为主键。
Product.cs文件内容:
namespace test_EFCore.Entities
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string ImageURL { get; set; }
public decimal Price { get; set; }
public int Qty { get; set; }
public int CategoryId { get; set; }
}
}
ProductCategory.cs文件内容:
namespace test_EFCore.Entities
{
public class ProductCategory
{
public int Id { get; set; }
public string Name { get; set; }
}
}
再新建一个cs文件:test_EFCoreDbContext.cs
test_EFCoreDbContext.cs文件内容:
using Microsoft.EntityFrameworkCore;
using test_EFCore.Entities;
namespace test_EFCore
{
public class test_EFCoreDbContext : DbContext
{
public test_EFCoreDbContext(DbContextOptions<test_EFCoreDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//Products
//Beauty Category
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 1,
Name = "Glossier - Beauty Kit",
Description = "A kit provided by Glossier, containing skin care, hair care and makeup products",
ImageURL = "/Images/Beauty/Beauty1.png",
Price = 100,
Qty = 100,
CategoryId = 1
});
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 2,
Name = "Curology - Skin Care Kit",
Description = "A kit provided by Curology, containing skin care products",
ImageURL = "/Images/Beauty/Beauty2.png",
Price = 50,
Qty = 45,
CategoryId = 1
});
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 3,
Name = "Cocooil - Organic Coconut Oil",
Description = "A kit provided by Curology, containing skin care products",
ImageURL = "/Images/Beauty/Beauty3.png",
Price = 20,
Qty = 30,
CategoryId = 1
});
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 4,
Name = "Schwarzkopf - Hair Care and Skin Care Kit",
Description = "A kit provided by Schwarzkopf, containing skin care and hair care products",
ImageURL = "/Images/Beauty/Beauty4.png",
Price = 50,
Qty = 60,
CategoryId = 1
});
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 5,
Name = "Skin Care Kit",
Description = "Skin Care Kit, containing skin care and hair care products",
ImageURL = "/Images/Beauty/Beauty5.png",
Price = 30,
Qty = 85,
CategoryId = 1
});
//Electronics Category
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 6,
Name = "Air Pods",
Description = "Air Pods - in-ear wireless headphones",
ImageURL = "/Images/Electronic/Electronics1.png",
Price = 100,
Qty = 120,
CategoryId = 3
});
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 7,
Name = "On-ear Golden Headphones",
Description = "On-ear Golden Headphones - these headphones are not wireless",
ImageURL = "/Images/Electronic/Electronics2.png",
Price = 40,
Qty = 200,
CategoryId = 3
});
modelBuilder.Entity<Product>().HasData(new Product
{
Id = 8,
Name = "On-ear Black Headphones",
Description = "On-ear Black Headphones - these headphones are not wireless",
ImageURL = "/Images/Electronic/Electronics3.png",
Price = 40,
Qty = 300,
CategoryId = 3
});
//Add Product Categories
modelBuilder.Entity<ProductCategory>().HasData(new ProductCategory
{
Id = 1,
Name = "Beauty",
});
modelBuilder.Entity<ProductCategory>().HasData(new ProductCategory
{
Id = 2,
Name = "Furniture",
});
modelBuilder.Entity<ProductCategory>().HasData(new ProductCategory
{
Id = 3,
Name = "Electronics",
});
modelBuilder.Entity<ProductCategory>().HasData(new ProductCategory
{
Id = 4,
Name = "Shoes",
});
}
public DbSet<Product> Products { get; set; }
public DbSet<ProductCategory> ProductCategories { get; set; }
}
}
这个文件主要是用来生成数据库的,数据库有两个表:Products和ProductCategories,并OnModelCreating函数中预先放了一些初始数据。
在Program.cs文件中添加如下代码:
builder.Services.AddDbContext<test_EFCoreDbContext>(p =>
{
p.UseSqlServer(builder.Configuration.GetConnectionString("SqlServer"));
});
在appsettings.json中加入数据库连接的字符串,这里有几个参数很重要!
server:这个是你服务器的IP地址,如果是本地的数据库则添入 localhost 或 127.0.0.1 ,如果是服务器上,则添入你服务器的公网IP地址。
uid:这个是你数据库的连接用户名。
pwd:这个是你数据库的连接密码。
database:这个是数据库的名称,一个数据库程序下可以有多个数据库。
"ConnectionStrings": {
"SqlServer": "server=**.***.***.***;uid=sa;pwd=*************;database=test_EFCore;TrustServerCertificate=true;"
},
最后,打开你的“程序包管理控制台”。
输入命令:Add-Migration Init
Init是一个更新字符串,随便写就行,每次更新数据库时不能一样。
输入命令:Update-Database
此命令用于提交更新到数据库。
看到Done则为成功。
用SSMS打开数据库,可以看到新数据库的内容: