当前位置: 首页 > news >正文

做网站 单页数量/百度账号申诉

做网站 单页数量,百度账号申诉,大学校园网站建设的,如何注册api key域名前言如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题。起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合理,一些关于数据库的迁移,比如新增表,字段&#…

前言

如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题。

起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合理,一些关于数据库的迁移,比如新增表,字段,修改字段类型等等,不应该和最上层的Web项目所关联,数据的迁移文件放到这里也感觉有点多余,有点乱乱的感觉,所以才想着单独出来由专门的项目进行管理会比较好,也比较清晰!

注意目标框架选择的是.NET Core 2.0而不是.NET Standard 2.0。

0、前期准备

a)、表实体定义,这个是在.NET Standard 2.0的类库中存放的。

///

/// 系统应用的用户实体

///

public class ApplicationUser : BaseModel

{

///

/// 用户名

///

public string UserName { get; set; }

///

/// 密码

///

public string Password { get; set; }

///

/// 邮件地址

///

public string Email { get; set; }

}

b)、新建一个.NET Core 2.0的类库,并定义好我们所要使用的数据库上下文,很简单,接下来开始我们的正文

///

/// 系统上下文

///

public class LightContext : DbContext

{

public LightContext(DbContextOptions options) : base(options)

{

}

///

/// 系统应用用户

///

public DbSet ApplicationUser { get; set; }

///

/// 角色表

///

public DbSet Role { get; set; }

}

1、问题汇总

首先要确保仓储类库中已经引入以下两个Nuget包,没有的话请使用包管理器进行安装。不建议直接引入原包:Microsoft.AspNetCore.All,按需引入即可

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools

a)打开CMD,然后切换到类库所在路径下,执行以下命令。不过你也可以使用程序包管理器控制台(PMC)进行迁移,但是会有少许变化,部分命令见下表:

迁移命令描述

CMD命令

PMC命令

创建迁移:migrationname为迁移名称

dotnet ef migrations add migrationname

add-migration migrationname

移除迁移(删除最近的一次迁移)

dotnet ef migrations remove

remove-migration

应用最新的迁移(使迁移文件应用到数据库)

dotnet ef database update

update-database

应用指定的迁移

dotnet ef database update migrationname

update-database migrationname

查看迁移列表

dotnet ef migrations list

查看数据库上下文信息

dotnet ef dbcontext info

dotnet ef

2b7865fac017c0cd41e9721782a68403.png

错误提示:

未找到与命令“dotnet-ef”匹配的可执行文件

解决方法:

在项目文件Light.Repository.csproj中添加以下节点

重新执行上面的命令,如果出现了EF Core的标志(一头蓄势待发的野马)表示已经成功

3e990fe35a3a15ff89bc4134f60f50fd.png

b)、执行以下命令进行迁移

dotnet ef migrations add InitLightDB

8ed0722e0285717639c34ba2555b495a.png

错误提示:

The specified framework version '2.0' could not be parsed

The specified framework 'Microsoft.NETCore.App', version '2.0' was not found.

- Check application dependencies and target a framework version installed at:

\

- Alternatively, install the framework version '2.0'.

解决方法:

在项目文件中添加以下节点:

netcoreapp2.0

2.0.3

c)、重新执行b步骤的命令,报错信息如下:

53fdfdecc095b79692dc4e2a8c560ecd.png

错误提示:

Unable to create an object of type 'LightContext'. Add an implementation of 'IDesignTimeDbContextFactory' to the project, or see

这个问题如果是在Web项目,并且配置了DbContext的链接字符串的话,是不会出现此问题的。很显然是迁移命令没有找到DbConnectionString导致的,接下来我们按照提示,实现一个IDesignTimeDbContextFactory试试

解决方法:

创建一个与DbContext同一目录下的DesignTimeDbContextFactory文件,然后实现接口中的方法CreateDbContext,并配置ConnectionString

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory

{

public LightContext CreateDbContext(string[] args)

{

var builder = new DbContextOptionsBuilder();

builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");

return new LightContext(builder.Options);

}

}

再次执行迁移命令,终于成功了。

ded09692fa937db9a50df96e54021c37.png

成功提示:

Done. To undo this action, use 'ef migrations remove'

同时类库下面会生成Migrations文件夹以及相关的迁移文件

d06120ba6081c987c872e50f5aef24d6.png

2、小试迁移命令

a)、使用以下命令应用迁移,生成数据库和表

dotnet ef database update

3683c6af964d4b3324478470220f3614.png

通过VS的SQL Server资源管理器查看生成数据库的结构,其中__EFMigrationsHistory为每次迁移的记录表

dbfb6396bca722afab133ce70201c3a8.png

b)、因为string类型的字段迁移到数据库之后的数据类型为nvarchar(max)并且是可空类型的,下面我们就使用Fluent API对ApplicationUser表字段进行配置,同样你也可以使用属性注解的方式进行配置,因为我自己不喜欢“污染”表实体

public static void ConfigApplicationUser(ModelBuilder modelBuilder)

{

modelBuilder.Entity(m =>

{

m.Property(t => t.Email)

.HasMaxLength(50);

m.Property(t => t.UserName)

.IsRequired()

.HasMaxLength(50);

m.Property(t => t.Password)

.IsRequired()

.HasMaxLength(20);

});

}

然后同样使用上面的两条命令重新迁移并更新数据库结构

2172478290de376e7634f3b619190fa5.png

观察数据库表结构已经更新

c43a3ad181baa57f50aeea3d40d76e5c.png

同理添加字段,删除字段都是一样的迁移操作,还是很方便的

3、扩展

a)、为了方便演示,其实上面在类库中执行迁移时的数据库连接字符串是写死的,那么最好的办法是应该去读取Web项目下已经配置好的连接,这样就能保证上下的一致性,不用再去为了EF的迁移而单独维护一个多余的数据库连接配置。改造也很简单,即通过Configuration组件读取appsettings.json的ConnectionStrings节点,改造之后是这样子的:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory

{

public LightContext CreateDbContext(string[] args)

{

Directory.SetCurrentDirectory("..");//设置当前路径为当前解决方案的路径

string appSettingBasePath = Directory.GetCurrentDirectory() + "/Light.AuthorityApi";//改成你的appsettings.json所在的项目名称

var configBuilder = new ConfigurationBuilder()

.SetBasePath(appSettingBasePath)

.AddJsonFile("appsettings.json")

.Build();

var builder = new DbContextOptionsBuilder();

//builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");

builder.UseSqlServer(configBuilder.GetConnectionString("LightConnection"));

return new LightContext(builder.Options);

}

}

注意需要额外引入下面这个Nuget包:

Install-Package Microsoft.Extensions.Configuration.Json

b)、属性注解[Column(Order = 1)]对EF Core来说还没有达到可以调整数据库生成字段的顺序,不过我们还是可以修改迁移文件的实体属性的顺序来达到我们想要的效果。下面是我调整之后重新生成的表,是不是看出来和上面的有什么不同,一图胜万语:

007f123a8981d5d2aa8f2e169f5d56a5.png

c)、最后一步,自己动手试试看:创建一个SeedData迁移文件来添加数据库的初始数据。:)

4、最后

EF Core的强大远不止这些,还有更多的使用方法等着我们去发现,去探索。每天进步一点点,是件很愉快的事情!

http://www.lbrq.cn/news/1269775.html

相关文章:

  • 加快网站集约化建设总结/百度优化seo
  • iis默认网站停止/seo是什么岗位的缩写
  • 对网站建设服务公司的看法/百度引擎提交入口
  • 介绍几个有趣的网站/深圳网络营销外包公司推荐
  • 简述企业网站的基本功能/网络营销方式方法
  • 产品网站有哪些/软件开发流程八个步骤
  • 昆明网站建设要多少钱/新东方考研班收费价格表
  • 做网站容易吧/拼多多跨境电商平台
  • 住房城乡建设部网站/百度百家官网入口
  • 优化网站建设哪家专业/域名买卖交易平台
  • 花生壳域名做网站/媒体推广
  • 改进网站建设/开网店怎么推广运营
  • 二手书交易网站开发现状/苏州网站关键字优化
  • 做网站网站/北京seo报价
  • 做网站素材网/仁茂网络seo
  • 做网站 郑州公司哪家好/百度推广助手电脑版
  • 网站建设专题/学做网站需要学什么
  • 怎样做分销网站/网上营销方式和方法
  • 浙江华企做网站/外链网站是什么
  • 网站要怎么做才能获得市场份额/网站制作费用多少
  • 企业建站用什么软件/免费b站推广软件
  • 长治网站制作平台/百度电话销售
  • 成都企业网站制作/2022最新版百度
  • 鹤壁哪有做网站的/seo外包公司报价
  • 做网站的有哪些学校/seo一个月赚多少钱
  • 深圳网站建设公司招聘/关键词排名提升工具
  • 网站开发需求说明书模板/营销官网
  • 莱芜举报网站/搜索引擎seo外包
  • 如何在网站做qq群链接/自动app优化最新版
  • 网站专题建设合同/杭州seo俱乐部
  • 对于考研数学的理解
  • 我的世界进阶模组教程——物品(2)
  • React ahooks——副作用类hooks之useThrottleEffect
  • QT中使用OpenCV保姆级教程
  • Java 学习笔记:常用类、String 与日期时间处理
  • 学习笔记:原子操作与锁以及share_ptr的c++实现