我们能否从现有数据库的选定表中搭建DbContext?

79
与之前版本的 Entity Framework 相同,Entity Framework Core 中是否可以仅对选定的表进行反向工程,以创建相应的模型类。这个官方 ASP.NET 网站将整个数据库进行反向工程。在过去,正如这个 ASP.NET 教程所演示的,使用旧版 EF,您可以选择只反向工程选定的表/视图。

1
看看旧答案。它描述了可以使用dotnet ef dbcontext scaffold多个-t参数,指定需要脚手架的表。 - Oleg
@Oleg 那应该可以 - 谢谢。你在旧帖子中提到的关于反向工程中表选择的参考资料就是一个答案。为了其他读者的利益,您可能希望将您的评论转换为答案; 我会将其标记为答案。 - nam
6个回答

142
可以使用 dotnet ef dbcontext scaffold 命令来解决这个问题,通过多次使用 -t (--table) 参数,可以指定导入(脚手架化)的所有表。该功能最初在这里描述:这里
在脚手架化数据库时,可以指定要使用的模式中的确切表格,以及省略其余部分。以下是命令行示例,显示了筛选表所需的参数。
.NET Core CLI:
dotnet ef dbcontext scaffold
          "server=localhost;port=3306;user=root;password=mypass;database=sakila" 
         MySql.Data.EntityFrameworkCore -o sakila
         -t actor -t film -t film_actor -t language -f  

Visual Studio中的包管理器控制台:

Scaffold-DbContext "server=localhost;port=3306;user=root;password=mypass;database=sakila"
     MySql.Data.EntityFrameworkCore -OutputDir Sakila
     -Tables actor,film,film_actor,language -f   

2
这是一个解决方法,但我有一个相当大的数据库,我只想为现有表生成对象,而不是视图。当生成所有内容时,我最终得到了156个类,不太想手动选择数十个要排除视图的表。 - Vočko
@Vočko:如果你仔细查看我发布的那一行(向右滚动),你会发现我建议使用“-t”参数多次与需要的表一起使用:“-t actor -t film -t film_actor -t language”。结果,dotnet将为我们指定的表生成脚手架:“actor”,“film”等。 - Oleg
@Vočko:抱歉,我还是不明白你的意思。你有什么新问题要问我吗?你在我的旧答案下发表了评论,问题是如何为现有数据库的选定(特定)表创建EF模型,而不是为所有现有表生成EF模型(默认行为)。我的答案是在.NET Core的第一个版本发布之前编写的。当时没有脚手架视图。 - Oleg
另一件事是要检查大小写敏感性。 - user1131926
顺便提一下,dotnet core CLI 命令和 PS 版本都可以在 VS 的 Package Manager 控制台中使用。 - Mark Z.
显示剩余2条评论

25

Force标签将更新输出目录中现有的所选模型/文件。

Scaffold-DbContext "Server=(localdb)\v11.0;Database=MyDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -t User, Role -f

13

.NET Core CLI:

dotnet ef dbcontext scaffold "server=localhost;port=3306;user=root;password=mypass;database=sakila" MySql.Data.EntityFrameworkCore -o sakila -t actor -t film -t film_actor -t language -f

Visual Studio中的包管理器控制台:

Scaffold-DbContext "server=localhost;port=3306;user=root;password=mypass;database=sakila" MySql.Data.EntityFrameworkCore -OutputDir Sakila -Tables actor,film,film_actor,language -f

EF Core,MS SQL PM:
Scaffold-DbContext "server=PC\SQL2012;user=test;password=test123;database=student" Microsoft.EntityFrameworkCore.SqlServer -OutputDir student-Tables stu.names,stu.grades -f 

如需更多参考,请访问entityframework-core-scaffold


6

包管理器控制台(MySql)

Scaffold-DbContext "server=localhost;port=3306;user=root;password=yourpassword;database=sakila" MySql.EntityFrameworkCore -OutputDir Models -Tables actor,film,film_actor,language -f

包管理器控制台(MSSQL)

Scaffold-DbContext "Server=desktop-vd5sscb;Initial Catalog=databaseName;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f

软件包管理器控制台(Sqlite)

Scaffold-DbContext "data source = yourdbname" Microsoft.EntityFrameworkCore.Sqlite -OutputDir Models -f

对于Sqlite,默认的数据库目录是您的项目文件夹...即控制器文件夹所在的位置。


2
考虑到,如果您有n个表,在设计时,您的数据库设计架构应将这些表分组到适当的模式中。
例如:对于“公司”数据库,您可以拥有许多表,当您设计数据库时,请将这些表分组到模式中,例如:用户、产品A、产品B、产品C等。
然后假设您只在处理ProductA表,那么您可以简单地添加-Schemas标志,并仅脚手架ProductA中的表。
另一个例子可能是,假设您只在处理授权项目,并且要使用ef实现身份验证,则可以仅脚手架“用户”模式而不是产品,并使您的oAuth API正常工作。
这些只是您可以有效使用脚手架的几个用例。

对我来说,这似乎更实际,而不是为选定的表创建单独的数据库,以便在构建 dbcontext 时享受更清晰的方法。 - muhammad tayyab

1

-Tables table1, table2, table3参数适用于需要处理多个表的情况。 -o Model参数是生成模型所在文件夹的输出路径。 -force参数可以每次启动时重新生成模型,例如更新数据库。 -Context DbE参数可以重命名数据库上下文类。

包管理器控制台

Scaffold-DbContext name=ConnectionStrings:DbE Microsoft.EntityFrameworkCore.SqlServer -o Model -force -Tables T_Users_Of_Chat -Context DbE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接