在实体框架(脚手架)中使用数据库优先方法时,是不是忽略 HasKey.HasName("PK_123ABC")?

Posted

技术标签:

【中文标题】在实体框架(脚手架)中使用数据库优先方法时,是不是忽略 HasKey.HasName("PK_123ABC")?【英文标题】:When using a database first approach in entity framework (scaffolding) Is the HasKey.HasName("PK_123ABC") ignored?在实体框架(脚手架)中使用数据库优先方法时,是否忽略 HasKey.HasName("PK_123ABC")? 【发布时间】:2021-07-13 04:59:38 【问题描述】:

当从数据库搭建脚手架时,在 OnModelCreating fluent 构建器中创建主键时添加了 HasName 属性:

entity.HasKey(e => e.AttachFileId)
                .HasName("PK__TableName__S34F3453GHJ");

数据库已被删除并在数据库中重新创建了几次,您可以想象每次的键名都是随机的。到目前为止,在运行该应用程序时,我从未遇到过使用外键针对此表的任何问题。 (即使它与数据库中的不匹配)

我可以删除它,但是其他人可能最终会再次搭建脚手架,并且默认情况下始终以这种方式创建。

(也仅供参考)这个应用程序将始终是数据库优先的,在这种情况下没有选择代码优先的选项。

那么当首先使用数据库时,这个属性总是被忽略吗?我可以安全地假设只要不执行迁移,应用程序运行时它就会继续被忽略吗?

谢谢!

【问题讨论】:

如果您不打算创建新的迁移,这需要知道 PK 名称才能删除/重新创建它,这没关系。 【参考方案1】:

如果您说系统将始终使用数据库优先的方法,那么您需要在数据库端管理约束名称。

过去,我编写了一个脚本,用于统一重命名 PK、FK、defauls 等,从那时起我就使用它。相关部分(用于 PK)如下所示:

/*
Primary keys

Pattern:
PK_[%SCHEMA%_]%TABLENAME%
*/

print 'print ''-- Primary keys'';
go
';

select N'exec sp_rename N' + quotename(sq.OldName, '''') + N', N' + quotename(sq.[NewName], '''') + N', N''INDEX'';
go
' as [-- Primary keys]
from (
    select object_name(parent_object_id) as [SortOrder], k.name as [ObjectName],
        quotename(object_schema_name(k.parent_object_id)) + N'.' + quotename(object_name(k.parent_object_id)) + N'.' + quotename(k.name) as [OldName],
        N'PK_' + case when schema_name(k.schema_id) != 'dbo' then object_schema_name(k.parent_object_id) + N'_' else N'' end + object_name(parent_object_id) as [NewName]
    from sys.key_constraints k
    where is_ms_shipped = 0
        and type_desc = 'PRIMARY_KEY_CONSTRAINT'
        and objectproperty(parent_object_id, 'IsUserTable') = 1
    ) sq
where sq.ObjectName != sq.[NewName]
order by sq.SortOrder;
go

此代码不会自行重命名任何内容;相反,它会生成 sp_rename 调用的列表,这些调用在执行时会完成所有工作。

您可以养成在对数据库项目进行更改之前始终运行此代码的习惯(您对数据库进行源代码控制,例如使用 SSDT,对吗?...),这将缓解此问题和其他类似问题。

【讨论】:

以上是关于在实体框架(脚手架)中使用数据库优先方法时,是不是忽略 HasKey.HasName("PK_123ABC")?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架脚手架和迁移不起作用

如果我们使用实体框架和代码优先方法,是不是可以在给定路径上创建数据库(Sql Server compact)?

无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体

实体框架支持来自数据库优先方法的默认约束

刷新在实体框架中使用数据库优先方法模型创建的实体中的数据

有没有人将实体框架与代码优先方法与 Edmx 文件混合使用?