SQL Entity Framework 核心代码优先不支持哪些 SQL Server 2017 功能?
What SQL Server 2017 features are not supported in Entity Framework Core code first?
我们的团队正在考虑利用 Entity Framework 核心代码优先来帮助对数据库建模。我们可以同时拥有 DB 项目和 EF 模型,根据此处的文章Database Projects vs. Entity Framework Database Migrations 利用模式比较,只是想弄清楚真相的来源是什么?
Entity Framework 是否支持 SQL 服务器 SSDT 数据库项目中的所有功能?
EF Core 2 不支持哪些功能? (例如,它不支持以下任何一项:触发器、视图、函数、存储过程、加密密钥、证书、数据库属性(ansi null、带引号的标识符)、分区)
我正在尝试查找 Microsoft 资源。
EF Core 只是 ORM。
1) 您应该准备好手动创建除表之外的所有数据库对象。我手动创建的内容:constrates(默认值和条件)。因为这是代码优先——SP、函数等不需要。如果您使用 ORM - DB 只是存储。当然实践很重要。对我来说,默认约束增加了我手动创建测试数据的表的舒适度。在您不信任您的(团队)代码的情况下,条件也很有用。
2) 您将创建(和删除)视图、触发器、sp 等 "migration" 代码(在 EF 中有这样的概念)sql:
migrationBuilder.Sql("CREATE VIEW ...");
因此,您可以有一个单独的 "migration" 程序(例如命令行工具)来安装或删除 Ef Core 表和您手动创建的对象,执行和还原数据迁移。
"EF Core migrations"比较复杂api(预留一周时间学习)。有趣的主题:在一个数据库中管理多个数据库上下文,在从模型注释迁移期间创建数据库对象,卸载。或者找个freelancer吧(这部分项目适合外包)。
tl;dr 数据库项目功能丰富,但数据库优先。迁移是代码优先的,但内置的数据库功能集非常有限。
对于很多人来说,比较数据库项目和迁移是无关紧要的。它们代表了 Entity Framework 的两种不同工作模式。迁移是代码优先的,DP 是数据库优先的。当然,您可以使用迁移来控制数据库模式,此外还可以使 DP 与生成的数据库保持同步以满足 DBA 的要求(如 link 所建议的那样)。但两人各自过着自己的生活,没有Single Source Of Truth.
因此,如果您不确定要选择哪种工作模式,比较它们很有用。
对我来说最重要的区别是 DP 将覆盖 所有 数据库对象并在比较数据库时检测它们之间的 所有 变化。迁移仅检测数据库和映射模型之间的更改。生成数据库对象的选项集非常有限。对于您需要的一切,您还必须将 SQL 语句注入迁移代码。这些声明是您自己的责任。您必须自己弄清楚迁移是否需要 ALTER PROCEDURE
语句(例如)。如果脚本和数据库在这方面不同,EF 不会抱怨。
这就是我一直不喜欢迁移的主要原因。维护一个成熟的数据库模式几乎是不可能的,包括存储、文件组、权限、排序规则等等。
DP 的另一个优势是它们与源代码管理结合得很好。每个数据库对象都有自己的文件,检查每个对象的更改历史非常容易。这对于生成的迁移是不可能的。事实上,许多中间更改可能永远不会进入生成的迁移。
当然,迁移的明显优势是可以进行运行时检查(尽管不完整)代码和数据库是否匹配。在数据库优先项目中,您需要为此创建自己的机制。
我们的团队正在考虑利用 Entity Framework 核心代码优先来帮助对数据库建模。我们可以同时拥有 DB 项目和 EF 模型,根据此处的文章Database Projects vs. Entity Framework Database Migrations 利用模式比较,只是想弄清楚真相的来源是什么?
Entity Framework 是否支持 SQL 服务器 SSDT 数据库项目中的所有功能?
EF Core 2 不支持哪些功能? (例如,它不支持以下任何一项:触发器、视图、函数、存储过程、加密密钥、证书、数据库属性(ansi null、带引号的标识符)、分区)
我正在尝试查找 Microsoft 资源。
EF Core 只是 ORM。
1) 您应该准备好手动创建除表之外的所有数据库对象。我手动创建的内容:constrates(默认值和条件)。因为这是代码优先——SP、函数等不需要。如果您使用 ORM - DB 只是存储。当然实践很重要。对我来说,默认约束增加了我手动创建测试数据的表的舒适度。在您不信任您的(团队)代码的情况下,条件也很有用。
2) 您将创建(和删除)视图、触发器、sp 等 "migration" 代码(在 EF 中有这样的概念)sql:
migrationBuilder.Sql("CREATE VIEW ...");
因此,您可以有一个单独的 "migration" 程序(例如命令行工具)来安装或删除 Ef Core 表和您手动创建的对象,执行和还原数据迁移。
"EF Core migrations"比较复杂api(预留一周时间学习)。有趣的主题:在一个数据库中管理多个数据库上下文,在从模型注释迁移期间创建数据库对象,卸载。或者找个freelancer吧(这部分项目适合外包)。
tl;dr 数据库项目功能丰富,但数据库优先。迁移是代码优先的,但内置的数据库功能集非常有限。
对于很多人来说,比较数据库项目和迁移是无关紧要的。它们代表了 Entity Framework 的两种不同工作模式。迁移是代码优先的,DP 是数据库优先的。当然,您可以使用迁移来控制数据库模式,此外还可以使 DP 与生成的数据库保持同步以满足 DBA 的要求(如 link 所建议的那样)。但两人各自过着自己的生活,没有Single Source Of Truth.
因此,如果您不确定要选择哪种工作模式,比较它们很有用。
对我来说最重要的区别是 DP 将覆盖 所有 数据库对象并在比较数据库时检测它们之间的 所有 变化。迁移仅检测数据库和映射模型之间的更改。生成数据库对象的选项集非常有限。对于您需要的一切,您还必须将 SQL 语句注入迁移代码。这些声明是您自己的责任。您必须自己弄清楚迁移是否需要 ALTER PROCEDURE
语句(例如)。如果脚本和数据库在这方面不同,EF 不会抱怨。
这就是我一直不喜欢迁移的主要原因。维护一个成熟的数据库模式几乎是不可能的,包括存储、文件组、权限、排序规则等等。
DP 的另一个优势是它们与源代码管理结合得很好。每个数据库对象都有自己的文件,检查每个对象的更改历史非常容易。这对于生成的迁移是不可能的。事实上,许多中间更改可能永远不会进入生成的迁移。
当然,迁移的明显优势是可以进行运行时检查(尽管不完整)代码和数据库是否匹配。在数据库优先项目中,您需要为此创建自己的机制。