在实体框架(脚手架)中使用数据库优先方法时,是不是忽略 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)?