如何防止 Entity Framework Core 2.0 重命名生成类中的表和列(数据库优先)

Posted

技术标签:

【中文标题】如何防止 Entity Framework Core 2.0 重命名生成类中的表和列(数据库优先)【英文标题】:How to prevent Entity Framework Core 2.0 from Renaming Tables and Columns in Generated Classes (Database First) 【发布时间】:2017-10-25 14:19:47 【问题描述】:

我一直在研究一个需要使用 Entity Framework 的 ASP.NET MVC Core 2.0 项目(针对 .NET Core 2.0)。要使用的数据库已经存在,我无法更改它。我已将所有必需的引用添加到 Entity Framework Core 2.0。

但是,当我从 Nuget 包管理器控制台运行以下脚手架命令时,与原始表相比,我获得了具有不同大小写的表的 POCO 模型类。除了其他差异之外,名称中带有下划线的列由不带下划线的属性表示。

如何强制脚手架在生成 POCO 模型类时保留所有表和列名?

脚手架命令示例。 Scaffold-DbContext "服务器 = 信息;数据库 = 车辆;Trusted_Connection = True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir 模型 -force

(第一次在 Stack Overflow 上发帖。感谢您的帮助。)

【问题讨论】:

我强烈建议您使用正在生成的名称。它们遵循 C# 推荐标准 这是否意味着我需要重命名数据库中的表及其列以匹配 POCO 类中生成的名称?否则我相信我的 DbContext SaveChanges() 会失败。 @DavidG 问题是我的一些表的名称末尾带有字母“s”。表名不是复数形式,例如“bas”。但是 EF 创建了一个模型“ba”,删除了尾随的 s。在这种情况下,它与传统无关。 .Net 框架的旧 EF 可以选择保留所有名称并创建 1:1 模型。 (我知道它是一个旧帖子,但它可能会导致对这个问题的已知答案) 好的,我用 -NoPluralize 选项解决了我的问题。尽管这听起来不像是我的问题的解决方案,因为我希望它不会把我的话变成单数形式。 【参考方案1】:

-UseDatabaseNames 选项旨在将名称与数据库中的名称完全相同(如果它们不是有效的 C# 标识符,则只需进行少量更正)。

不幸的是,此选项在 2.0 版(问题 #9146)中从 Scaffold-DbContext 命令中删除,并且未应用于属性名称(问题 #9820)。您必须等待 EF Core 2.1 按预期使用它。如果您想尽快尝试,可以随时使用the nightly builds。

【讨论】:

当 EF Core 2.1 发布时,并且当我使用选项 -UseDatabaseNames 时,是否会保留表名和列名(如您所指出的,进行一些小的更正)?从您的回答中,我很清楚该选项将保留表名,但我不确定您是否也指列名。 是的,它将保留 2.1 版中的表名和属性名。 2.0 中的dotnet ef dbcontext scaffold --use-database-names 命令只会保留表名。 这是个好消息。这将使我能够创建需要作为“数据库优先”的 MVC/EF 项目。非常感谢您回答我的问题! @bricelam 您能否详细说明我可以如何使用每晚构建? Add the nightly feed/package source,确保选择了 Include prerelease,并安装包的夜间版本。【参考方案2】:

解决方案:您必须更新到 .Net Core 2.1+,然后才能运行 Scaffold-DbContext -UseDatabaseNames。我已经在 Net 2.1 RC 中尝试过,现在可以使用了。

【讨论】:

@CodeF0x,错字:“seDatabaseNames”=>“UseDatabaseNames”

以上是关于如何防止 Entity Framework Core 2.0 重命名生成类中的表和列(数据库优先)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Entity Framework仅更新一个字段?

C# Entity-Framework:如何在模型对象上组合 .Find 和 .Include?

Entity Framework 3.5 - 如何加载孩子

如何扩展 Entity Framework 6 模型

如何使用 Entity Framework 7 记录查询?

如何在 Entity Framework Core 中运行存储过程?