【问题标题】: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

标签: asp.net-core entity-framework-core


【解决方案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
        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2013-08-20
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        相关资源
        最近更新 更多