一.代码优先 创建数据库(SQLServer2012)
1.创建core3.1的项目
项目结构如下
如图,我这里创建了一个core的类库用来保存数据库相关的实体
注意:使用的类库环境必须与core项目的环境一致
2.添加所需NUGet包
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Design
3.创建一些实体
添加实体注解需要引用命名空间:
using System.ComponentModel.DataAnnotations;
3.1用户类
public class Customers
{
public int ID { get; set; }
[StringLength(50)]
public string Name { get; set; }
[StringLength(2)]
public string Sex { get; set; }
[StringLength(11)]
public string Phone { get; set; }
[StringLength(200)]
public string Address { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
3.2商品类
public class Product
{
public int ID { get; set; }
[StringLength(20)]
public string Name { get; set; }
public decimal Price { get; set; }
public string Desc { get; set; }
///
/// 导航属性 一件商品对应一个分类
///
public ProductType ProductType { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
3.3商品类型类
public class ProductType
{
public int ID { get; set; }
[StringLength(20)]
public string TypeName { get; set; }
///
/// 导航属性 一对多,一个类型可对多个商品
///
public ICollection Products { get; set; }
}
1
2
3
4
5
6
7
8
9
10
3.4上下文类
///
/// 上下文类
/// 继承系统上下文
///
public class CoreMVCContext:DbContext
{
public CoreMVCContext()
{
}
public CoreMVCContext(DbContextOptions option) : base(option)
{
}
public DbSet ProductTypes { set; get; }
public DbSet Product { set; get; }
public DbSet Customers { set; get; }
///
/// 重写父类的方法 用于连接数据库
///
///
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
//连接字符串
optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=CoreMVC;Integrated Security=True");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
4.准备代码的迁移与数据库的更新
4.1代码迁移:Add-Migration
4.2数据库更新:update-database
二、数据库优先 创建实体类(SQLServer2012)
1.获得数据库的连接字符串
在这里右键添加连接,选择需要连接的服务器和数据库,本地为‘.’,,测试连接,连接成功了去“高级”里面将连接字符串复制出来,等会要用
2.安装所需依赖,同上
3.连接数据库
Scaffold-DbContext "Data Source=.;Initial Catalog=UU;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Model -Context UUDBContext
若启动项目不对
4.成功
有警告,注释掉那一行即可
三、数据库优先 创建实体类(MySQL 5.7)
本以为连接mysql会麻烦不少,记得年初连接mysql时还不支持ef6.x的框架,要连接还需要使用低配的依赖包才可以,但是这次却直接可以了,感觉有点神奇
1.获得连接字符串
同上,如果是知道连接的可以跳过
2.安装依赖包
因为这是mysql的,使用依赖包和上面的有所不同
Microsoft.EntityFrameworkCore.Tools
Microsoft.VisualStudio.Web.CodeGeneration.Design
MySql.Data.EntityFrameworkCore
Pomelo.EntityFrameworkCore.MySql
3.连接数据库并迁移
NuGet包控制台:
Scaffold-DbContext "server=数据库服务器;uid=数据库用户名;pwd=数据库密码;database=数据库名;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force
.Net Core CLi:
dotnet ef dbcontext scaffold "server=数据库服务器;uid=数据库用户名;pwd=数据库密码;database=数据库名;" Pomelo.EntityFrameworkCore.MySql -o Models -f
MySQL的代码优先与上差不多
四、补充(代码参数说明)
代码参数说明:
-OutputDir (-o) *** 实体文件所存放的文件目录
-ContextDir *** DbContext文件存放的目录
-Context *** DbContext文件名
-Schemas *** 需要生成实体数据的数据表所在的模式
-Tables(-t) *** 需要生成实体数据的数据表的集合
-DataAnnotations
-UseDatabaseNames 直接使用数据库中的表名和列名(某些版本不支持)
-Force (-f) 强制执行,重写已经存在的实体文件
五、更新
如果出现如下错误:
CS1705 C# 标识为“ShopMode, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”的程序集“ShopMode”所使用的“Microsoft.EntityFrameworkCore, Version=3.1.7.0, Culture=neutral, PublicKeyToken=adb9793829ddae60”版本高于所引用的标识为“Microsoft.EntityFrameworkCore, Version=3.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60”的程序集“Microsoft.EntityFrameworkCore”
1
则将Microsoft.EntityFrameworkCore.Tools的版本号进行降级,降到3.1.0即可
错误原因是该依赖包的版本要比项目文件的版本高