Entity Framework Core 数据库优先模式下如何在初始脚手架之后进行更新?

14
我正在尝试使用Entity Framework Core,并且一直在实现Database-First应用程序。最初的Scaffold-DbContext命令可以很好地创建所有实体,但并没有按我的喜好进行组织。这是一个使用模式将责任区域分解的SQL Server数据库,我不太喜欢Scaffold将它们全部放入单个文件夹中的事实。
除此之外,我一直无法确定是否有一种方法可以重新运行Scaffold以在数据库更新后更新类。我找到的最接近的方法是使用-force参数重新运行Scaffold-DbContext命令。然而,这也会覆盖我添加到Context.cs文件中的任何自定义代码,比如将连接字符串指向配置值而不是硬编码。
我已经看了几个类似这个的问题,但它只涉及初始脚手架,而非进一步的更新。
在没有手动编写任何未来更改的情况下,是否有一种方法可以实现这一点?如果没有,EF Core的基于数据库的方法似乎就毫无价值了。

对于您的模式注释,您可能想尝试类似于以下内容的语法,其中“integration”是模式的名称:dotnet ef dbcontext scaffold "<ConnectionString>" Microsoft.EntityFrameworkCore.SqlServer -c "IntegrationContext" --schema "integration" -f - Will Tartak
2个回答

11

就像你自己所说的...使用数据库优先方法的主要问题:不应该手动更改模型并进行重命名等操作,除非你100%确定你的数据库不会再发生变化。如果你不确定,请使用被自动生成的模型编码。

重新生成将覆盖直接在模型类中进行的任何更改,擦除你所做的所有更改或添加。

但是,你可以创建旁边的部分类,这些类不会被自动映射覆盖:

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

这是一种不错的方式,在确保实体不会被自动映射修改的情况下添加代码。只需确保局部视图与自动生成的类具有相同的名称,一切都应该没问题。


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

3

是的,但当我这样做时,它确实会给我带来很多麻烦。我也有同样的想法,但在我的实践中,这变得很困难,因为我不得不开始修改context.cs以及我的生成类。比如说,如果我添加一个外键之类的东西。 - johnny
@Johnny,Code First 假定您将上下文和实体类视为主模型而非生成的模型。您的更改将在代码中完成,然后通过迁移应用于数据库。但是我同意,有时可能会很棘手。您可以运行嵌入式脚本进行某些 SQL 更改,例如添加额外的索引。 - Michael Freidgeim
@MiFreidgeimSO-stopbeingevil 如果 DBA 要求你提交 DDL 更改,你该怎么办?我们不时需要从生产环境刷新开发环境,对于 Code First 在实际场景中我完全感到困惑。 - Dan Chase
@DanChase,不确定是否完全理解您的情况。要么向DBA解释,在Code First中,DDL是作为代码部署的一部分部署的,要么不使用Code First。最好提出一个新问题,并提供更多细节以便让其他人回答。 - Michael Freidgeim

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