实体框架核心数据库-初始支架后首次更新?

问题描述 投票:0回答:3

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

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

我看过其他几个类似于这个问题的问题,但它只讨论了最初的支架,而不是进一步的更新。

有没有办法不需要手动编码任何未来的更改来做到这一点?如果没有这一点,数据库优先的方法对于 EF Core 来说似乎毫无价值。

entity-framework entity-framework-core ef-database-first
3个回答
11
投票

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

重新脚手架将覆盖直接在模型类中所做的任何更改,删除您已更改或添加的所有内容。

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

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

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


3
投票

可重新运行的脚手架可用于真正的数据库优先方法,如 Antoine Pelletier 的回答

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


0
投票

更新答案

.NET Core 8.0

使用具有额外属性的相同 Scaffold 命令

-f

Scaffold-DbContext "Server=(localdb)\MSSQLLocalDB;Database=ProductDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f

这里

-f
的意思是
-force

© www.soinside.com 2019 - 2024. All rights reserved.