宝哥软件园

在中使用EF Core将数据库迁移到SQL Server的方法 NET核心类库

编辑:宝哥软件园 来源:互联网 时间:2021-09-02

如果只是使用EntityFramework Core作为ORM框架,在数据库迁移时会遇到一些问题。

一开始是在ASP.NET core的Web项目中做的,后来发现放在这里不合理。一些数据库迁移,如添加表、字段、修改字段类型等。不应与顶级网站项目关联。这里数据的迁移文件也感觉有点多余和混乱,所以我觉得单独用一个专门的项目来管理会更好更清晰!

请注意,目标框架是。NET Core 2.0而不是。NET标准2.0。

0.前期准备

a)表实体定义,存储在的类库中。NET标准2.0。

///summary ///系统应用的用户实体////summary公共类应用用户:基础模型{///summary////用户名////summary公共字符串用户名{ get设置;}///summary///password////summary公共字符串密码{ get设置;}///summary///email address////summary public string email { get;设置;} }b)创建的新类库。NET Core 2.0并定义我们想要使用的数据库上下文。很简单,然后开始我们的文字

///summary///system context////summary public class light context : db context { public light context(dbcontextoptions light context options): base(options){ }///summary////system application user///summary public dbetaapplication user application user { get;设置;} ///summary ///角色表////summary public dbset角色{ get设置;} }1.问题概述

首先,确保以下两个Nuget包已经被引入仓库类库。如果没有,请使用软件包管理器安装它们。不建议直接导入原包:微软。所有这些都可以根据需要导入。

安装包微软。entityframeworkore . SQL server install-打包微软。entityframeworkcore.tools a)打开CMD,然后切换到类库所在的路径,并执行以下命令。但是,您也可以使用包管理器控制台(PMC)进行迁移,但会有一些更改。有关一些命令,请参见下表:

迁移命令描述CMD命令PMC命令创建迁移:migrationname是迁移名称dotnet ef migrations添加迁移名称add-migration migrationname删除迁移(删除最新的迁移)Dotnet ef migrations删除-迁移应用最新的迁移(使迁移文件应用于数据库)dotnet ef数据库更新-数据库应用指定的迁移Dotnet ef数据库更新迁移名称Update-数据库迁移名称查看迁移列表dotnet ef migrations li St查看数据库上下文信息dot net ef db上下文信息Dotnet ef

错误提示:

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

解决方法:

在项目文件“灯光”中添加以下节点。Repository.csproj

item group dotnetclitool reference include=' MicroSoft。entityframeworkore . tools . dotnet ' version=' 2 . 0 . 1 '/item group重新执行上述命令,如果出现EF Core(一匹准备出发的野马)的符号,则表示成功。

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

dotnet ef迁移添加InitLightDB

错误提示:

无法解析指定的框架版本“2.0”。找不到版本为“2.0”的netapp。-检查应用程序依赖关系,并以安装在:的框架版本为目标-或者,安装框架版本“2.0”。

解决方法:

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

property group targetframework netcoreapp 2.0/targetframework runtimeframework version 2 . 0 . 3/runtimeframework version/property group c),再次执行步骤b的命令,错误信息如下:

错误提示:

无法创建"光照上下文"类型的对象。将" idesigningtimedbcontextfactorylight context "的实现添加到项目中,或者参见https://go.microsoft.com/fwlink/?linkid=851728,了解设计时支持的其他模式。

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

解决方法:

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

公共类designtimedbcontext factory : idesigningtimedbcontextfactorylightcontext { public LightContext createdcontext(string[]args){ var builder=new dbcontext options sbuilderlightcontext();建筑商. UseSqlServer(' Server=(localdb) MSSQLLocalDB;集成安全性=真;初始目录=光;');返回新的LightContext(构建器。选项);} }再次执行迁移命令,终于成功了。

成功提示:

完成了。若要撤消此操作,请使用“ef迁移删除"

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

2、小试迁移命令

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

dotnet ef数据库更新

通过对的结构化查询语言服务器资源管理器查看生成数据库的结构,其中__EFMigrationsHistory为每次迁移的记录表

b),因为线类型的字段迁移到数据库之后的数据类型为nvarchar(最大值)并且是可空类型的,下面我们就使用流畅的应用编程接口对应用程序用户表字段进行配置,同样你也可以使用属性注解的方式进行配置,因为我自己不喜欢"污染"表实体

公共静态空配置应用程序用户(模型构建器模型构建器){模型构建器。实体应用用户(m={ m.Property(t=t.Email)).HasMaxLength(50);房产(用户名)。IsRequired().HasMaxLength(50);属性(密码)。IsRequired().HasMaxLength(20);});}然后同样使用上面的两条命令重新迁移并更新数据库结构

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

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

3、扩展

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

公共类DesignTimeDbContextFactory : idesigningtimedbcontextfactorylight context { public light context createdcontext(string[]args){ Directory } .SetCurrentDirectory(' . ');//设置当前路径为当前解决方案的路径字符串appSettingBasePath=目录. GetCurrentDirectory() '/Light ."权威人士";//改成你的appsettings.json所在的项目名称var configBuilder=新的configBuilder().设置基本路径(应用设置路径).AddJsonFile('appsettings.json ').build();var builder=new dbcontextoptions builder lightcontext();//构建器. UseSqlServer(' Server=(localdb) MSSQLLocalDB;集成安全性=真;初始目录=光;');建筑商。请使用SqlServer(configBuilder .GetConnectionString(' LightConnection ');返回新的LightContext(构建器。选项);} }注意需要额外引入下面这个Nuget包:

安装包微软。扩展。配置。jsonb)和属性标注[Column(Order=1)]还不能为EF Core调整数据库生成字段的顺序,但我们仍然可以修改迁移文件的实体属性的顺序,以达到预期的效果。下面是我调整后重新生成的表格。你看到与上表有什么不同吗?一图胜千言:

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

4.最后,

EF Core的功能远不止这些,还有更多的使用方式等着我们去发现和探索。每天进步一点是一种享受!

更多资讯
游戏推荐
更多+