使用数据库优先方法时如何更新模型

Posted

技术标签:

【中文标题】使用数据库优先方法时如何更新模型【英文标题】:How to update the model when using database first approach 【发布时间】:2016-12-08 23:02:33 【问题描述】:

我首先使用EntityFramework Core数据库创建模型as illustrated in the EF Core documentation

但我不知道如何在编辑数据库后更新模型。

【问题讨论】:

它叫Entity Framework Core 1.0 【参考方案1】:

您可以通过运行最初添加了-Force 选项的命令来重新构建模型。这将导致指定文件夹的内容被覆盖。使用包管理器控制台example from the EF Core docs,修改后的命令变为:

Scaffold-DbContext "Server=(localdb)\v11.0;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

或者,如果您使用CLI commands,则变为:

dotnet ef dbcontext scaffold "Server=(localdb)\v11.0;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -f

但是,您应该考虑使用迁移来保持模型和数据库架构彼此同步。这样您就可以对模型进行更改,然后将它们传播到数据库。

【讨论】:

这对我不起作用显示错误 "scaffold-DbContext" not found like that.Help plz 如果您收到一条错误消息,指出“Scaffold-DbContext”一词未被识别为 cmdlet 的名称,请关闭并重新打开 Visual Studio。 要知道你需要在 "" 中为你的连接字符串添加什么,这个视频真的很有帮助 --> VIDEO 您可以使用包管理器控制台-Tables 参数(learnentityframeworkcore.com/migrations/commands/…) 来指定要搭建的表:-Tables Products,或者如果您使用的是CLI,则参数是@ 987654331@(单数)learnentityframeworkcore.com/migrations/commands/… @SagarPatil 你不能。这不是受支持的方案。您需要重新编译应用程序才能使模型的任何更改生效。【参考方案2】:

附加提示

如果您要不时更新模型,这里有一种简化流程的便捷方法。

转到菜单工具 > 外部工具,然后添加一个新菜单并填写以下条目:


标题

Update DbContext

命令

dotnet.exe

参数

ef dbcontext scaffold "your-connection-string" Microsoft.EntityFrameworkCore.SqlServer --output-dir=Models --force

初始目录

$(ProjectDir)

然后选择勾选“使用输出窗口”,点击ApplyOK

当您再次转到工具时,这个新菜单应该会出现并准备好重复使用,只需单击一个按钮!

【讨论】:

谢谢,这很有用。【参考方案3】:

您需要进行迁移,请勿重新搭建脚手架,否则您将丢失在模型上完成的任何工作,例如数据验证。

【讨论】:

是的,对我来说,我不得不做 DTO 只是为了避免在我的模型中进行验证 那不完整。如果您只是执行迁移,您将覆盖由您的 DBA 而不是首先通过代码完成的数据库更改,您需要准备好您的简历。如果您必须使用迁移,则必须注释掉迁移将对数据库运行的所有更改,并确保您已正确手动更新所有 POCO 类和实体以匹配数据库。正如 Yom S. 所说,它可能最简单。此外,将来不要按照 SOLID 的“O”中所述向您的实体 POCO 类添加代码。开放继承 封闭更新 我认为我们根本不应该写入生成的代码。如果我们这样做,就会有问题。 问题是关于数据库优先的方法,然后迁移在这里不适用。迁移是模型优先的方法。【参考方案4】:

如果我们在dbcontext 类中自定义例如 添加LoggerFactory,然后在我们使用('Scaffold-DbContext "Server=(localdb)\v11.0;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force') 之后。此命令则所有自定义更改都将丢失。

【讨论】:

创建的 DbContext 类是分部类。您可以创建一个单独的文件并从那里对课程进行改进。【参考方案5】:

使用命令 Add-migration NameOfMigrationfile 在应用程序级别的迁移文件夹中创建。

如果未启用自动迁移,那么我们可以在包管理器控制台中使用以下一些命令。

PM > Enable-migrations -force(如果未启用自动迁移) PM > 添加-迁移迁移名称 PM > Update-database -force(如果 add-migration 命令不起作用,我们可以使用 udate 命令)

【讨论】:

【参考方案6】:

Mike 给出的解决方案对我来说没有问题。根据 Mike 的回答,这里有一些详细的回答。

Scaffold-DbContext "Server=Server name;Database=Database name;User ID=Login;password=Password" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Folder name -Force
文件夹名称:项目下的文件夹名称。必须在执行此命令之前创建文件夹。

样本

Scaffold-DbContext "Server=.;Database=EmployeeDB;User ID=sa;password=12345" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "./EmployeeDBModel" -Force

如果您没有使用 SQL Server 身份验证,请参考 Mike 给出的答案。

【讨论】:

【参考方案7】:

您可以使用此扩展程序:EF Core Power Tools ,它会让你的生活更轻松,而且你不必编写任何命令行。

【讨论】:

扩展无法与最新的 EF 核心一起工作...但看起来真的很好。 @Iannick 直到今天,我每天都在使用最新版本的 VS2022 和 EF6,它运行良好;如果您有任何问题,您可能需要在这里查看github.com/ErikEJ/EFCorePowerTools/wiki【参考方案8】:

对于那些喜欢将所有内容保留在同一个 DbContext 类中的人,请使用带有选项 -Context 的 Scaffold-DbContext。

示例:

Scaffold-DbContext "Server=server;Database=mydb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f -Context MyDbContext

为 MyDbContext 生成的代码将被放置在一个新的部分类文件中,因此不会丢失任何代码。

【讨论】:

【参考方案9】:

打开您的 ContextModel.edmx 文件以显示模型图。右键单击设计图面上的任意位置,然后选择Update Model from Database..。 在更新向导中,选择刷新标签并选择您的表格,然后单击完成按钮。

更多图片详情请访问:EF Database First with ASP.NET MVC: Changing the Database

【讨论】:

这只能在 EF6 及更低版本之前实现 - 而不是核心变体,根据要求。 问题是针对 EF Core 而不是 EF

以上是关于使用数据库优先方法时如何更新模型的主要内容,如果未能解决你的问题,请参考以下文章

代码优先更新数据库错误“ApplicationDbContext”上下文已更改

EF 4.1 模型中的图像数据类型优先

如何在实体框架中定义存储过程(代码优先)?

代码优先与模型/数据库优先[关闭]

C# 代码优先迁移,向上/向下?

如何使用实体框架更新数据库中的记录时覆盖模型验证