EF Core中Alternate Key和HasIndex在唯一性方面有什么真正的区别?

18

我对这个有什么真正的不同很感兴趣

e.HasIndex(c => new { c.UserId, c.ApplicationId, c.Value }).IsUnique();

和这个

e.HasAlternateKey(c => new { c.UserId, c.ApplicationId, c.Value });

在EF Core流畅的API配置中。

这里的使用场景是我们有一个名为Id的主键,然后我们有一个复合键(替代键),该键由以下属性构建:UserID ApplicationIdValue。 关于我的问题,我找到的唯一信息是来自此处的以下引用: https://www.learnentityframeworkcore.com/configuration/fluent-api/hasindex-method

"虽然在大多数实际方面相似,但这与在列上创建唯一约束不同,可以通过在属性上创建替代键来实现。"

我真的不理解这种差异的概念,也不知道唯一约束和唯一索引之间的区别。

如果有人能向我解释这些定义(及其之间的区别),我会非常感激。


2
这里有一个关于SQL Server唯一索引和唯一约束之间区别的解释 https://www.mssqltips.com/sqlservertip/4270/difference-between-sql-server-unique-indexes-and-unique-constraints/ - juharr
@juharr 谢谢你,这篇文章很有启发性。你想要我总结一下区别并回答问题,还是你自己写一个呢?^^ - Menyus
1
在外键关系的主体端可以使用备用键。同时在EF Core中,一旦创建后就无法修改(类似于主键)。有关EF Core文档,请参见:备用键 - Ivan Stoev
1
可变替代键的问题正在支持修改替代键属性的链接上进行跟踪,请投票以提高该问题在未来版本中考虑的优先级。 - Mark G
1个回答

13
根据官方文档
如果您只想在列上强制唯一性,请定义一个唯一索引而不是备用键(请参阅索引)。在EF中,备用键是只读的,并且提供了比唯一索引更多的语义,因为它们可以用作外键的目标。
换句话说,两者都创建了唯一索引,但备用键具有一些额外的属性(例如可以用作外键的目标)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接