EF Core 区分大小写的主键

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

我在应用程序中使用 EF Core 与数据库交互,并使用代码优先方法来生成和迁移所述数据库。

我从 API 接收到的实体不受我的控制,并且我想存储这些实体。 API 返回的实体使用区分大小写的 ID,我想将它们用作实体的主键,因为 API 确保它们是唯一的并使用这些 ID 进行关系映射。

最近了解到EF和SQL默认不区分大小写,需要设置排序规则。

在我的数据库上下文中,我正在寻找在任何属性上创建的属性类来更改该列的排序规则。

OnModelCreating

这似乎在迁移中效果很好,因为它生成了以下内容:

foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var property in entityType.GetProperties()) { // If the property is decorated with the CaseSensitive attribute then set the collation to be case sensitive if (property.PropertyInfo?.GetCustomAttribute<CaseSensitiveAttribute>() != null) { property.SetCollation("SQL_Latin1_General_CP1_CS_AS"); } } }

似乎将列设置为区分大小写。但是,每当我尝试添加具有相似 PK 的实体(仅因情况而异)时,执行 
APIEntityID = table.Column<string>(type: "nvarchar(450)", nullable: false, collation: "SQL_Latin1_General_CP1_CS_AS")

会引发异常,表示无法添加该实体,因为它已被添加到另一个实例中。

但是,我 99% 确信没有添加此实体的其他实例,因为它从发生以来就没有创建,并且它没有显示在我的日志中。此外,它总是在第一次出现“重复”PK 时失败,只是因情况而异。

为了让 EF 正确使用区分大小写,我缺少什么?

c# entity-framework-core collation
1个回答
0
投票

EF Core 跟踪内存中的实体时,默认使用不区分大小写的比较。这意味着,如果您有两个实体的主键值仅大小写不同,则 EF Core 在跟踪内存中的更改时可能会将它们视为同一实体。

为了解决这个问题,您可以尝试在DbContext配置过程中使用UseCollation方法在整个DbContext上配置区分大小写。这是一个例子:

dbContext.DbSet<entity>.Add(entityToAdd)

通过在 DbContext 级别使用 UseCollation,您可以为整个数据库上下文配置默认排序规则。这应确保 EF Core 在跟踪内存中的实体时执行区分大小写的比较。

此外,请确保您的数据库列排序规则确实设置为区分大小写,正如您在迁移脚本中提到的那样。

如果问题仍然存在,请考虑提供更多详细信息或检查 EF Core 日志以获取有关该问题的任何其他信息。

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