【问题标题】:Entity Framework Core Database-First Update after initial Scaffold?初始脚手架后实体框架核心数据库首次更新?
【发布时间】:2016-10-31 14:43:50
【问题描述】:

我正在使用 Entity Framework Core,并且一直致力于实现 Database-First 应用程序。最初的 Scaffold-DbContext 命令工作得很好,并且可以正确地创建我的所有实体,如果没有按照我想要的方式组织的话。这是一个 SQL Server 数据库,它使用模式来分解责任区域,我并不真正关心 Scaffold 只是将它们全部放入一个文件夹中的事实。

除此之外,我无法确定是否有办法在数据库更新后重新运行 Scaffold 以更新类。我能找到的最接近的是使用 -force 参数重新运行 Scaffold-DbContext 命令。但是,这也会覆盖我添加到 Context.cs 文件中的任何自定义代码,例如将连接字符串指向配置值而不是硬编码。

我查看了与this one 类似的其他几个问题,但它只讨论了最初的脚手架,而不是进一步的更新。

有没有办法手动编码任何未来的变化来做到这一点?如果没有它,EF Core 似乎会让数据库优先的方法变得毫无价值。

【问题讨论】:

  • 对于您的架构注释,您可能想尝试这样的事情,其中​​“集成”是架构的名称:dotnet ef dbcontext scaffold "" Microsoft.EntityFrameworkCore.SqlServer -c "IntegrationContext" --schema "集成" -f

标签: entity-framework entity-framework-core ef-database-first


【解决方案1】:

就像您自己说的...数据库优先方法的主要问题:您永远不应该手动更改模型并开始重命名等等。除非您 100% 确定您的数据库不会再更改。如果您不能 100 % 确定,只需使用自动生成的模型进行编码即可。

Re-Scaffolding 将覆盖直接在模型类中所做的任何更改,擦除所有更改或添加的内容。

但是您可以在不会被自动映射覆盖的一侧创建部分类:

public partial class TableName
{
    public string Name_of_a_property
    {get; set;}
}

这是一种向实体添加代码的好方法,同时确保它不会被自动映射影响。只要确保局部视图与自动生成的类同名,一切都应该没问题。

【讨论】:

  • 当然,今天是星期一,部分课程并没有进入我的脑海。我在使用 EF5 一段时间后放弃了 EF。完全忘记了这种方法。这将起作用。只是要记住在任何数据库更新后重新搭建。
  • 我不明白这样做有什么帮助。我相信你。我只是不知道该怎么做。当我第一次从数据库生成我的类时,我什么时候做部分类,在哪里做?然后重新搭建?
  • @johnny 您可以在项目中添加一个新类,奇怪的是,通过将部分类命名为相同的名称,因为您的表将使它们彼此看到,您可以使用您编写的额外功能部分类。虽然表类可能会在重新脚手架时发生变化,但部分类永远不会。在部分类中编写尽可能多的代码,而不是直接在模型类中。这仅适用于 DB。 (我希望它更有意义)
  • @AntoinePelletier 这是一个关于 Update-Scaffold 命令的有趣链接,该命令显然还没有进入 3.0 版本:github.com/aspnet/EntityFrameworkCore/issues/831
  • @DanChase 是的,还有一些其他技巧可以在没有部分类的情况下实现这一点。人们会在数据库优先的方法中选择他们认为最适合他们的方法。而且我下面的答案也不错。我应该编辑我的以包含更多可能性吗?另外,如果您愿意,可以编辑我的答案以包含您找到的其他方法。
【解决方案2】:

可重新运行的脚手架可用于真正的 DB First 方法,如 answered by Antoine Pelletier

然而,脚手架通常一次用于将模型初始导入代码,然后继续使用 Code First 方法。 过程到 使用逆向工程基于现有数据库创建实体框架模型 描述于https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db

【讨论】:

  • 是的,但是当我这样做时,它确实似乎确实引起了(我)很多头痛。我也有同样的想法,但在我的实践中很难做到,因为我必须开始弄乱 context.cs 以及我生成的类。说我是否添加了外键或其他东西。
  • @johnny,Code First 假设您认为上下文和实体类不是生成的,而是主模型。您的更改将在代码中完成,然后通过迁移应用到数据库。但是我同意,有时它可能很棘手。您可以为一些 sql 更改运行嵌入式脚本,例如添加额外的索引
  • @MiFreidgeimSO-stopbeingevil 如果 DBA 要求您提交 DDL 更改,您会怎么做?我们必须每隔一段时间从 prod 刷新我们的开发环境,而在现实世界的场景中,我对 Code First 完全感到困惑。
  • @DanChase,不确定,完全了解您的情况。要么向 DBA 解释,在 Code First DDL 中部署为代码部署的一部分,要么不使用 Code First。最好提出一个包含更多细节的新问题,以便其他人回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多