在 EF Core 中生成复合唯一 constraint/index

Generate a composite unique constraint/index, in EF Core

我的实体 Name 属性 需要一个复合唯一约束,每个 Category 都是唯一的(它有一个 FK)。

所以像这样:

entityTypeBuilder
  .HasIndex(i => new { i.Name, i.Category.Id })
  .IsUnique();

但是由于 Category.Id 导航 属性.

,当我生成迁移时,这失败了

我知道我可以将值硬编码为字符串,但我不想丢失静态类型。

我有什么选择?

在相关实体上为 CategoryId 的类别添加外键,并在索引构建器中使用它而不是导航 属性。

只要知道影子 属性 名称,就可以使用(至少在 EF Core 1.1.0 中)基于字符串的 HasIndex 方法 overload

public virtual IndexBuilder HasIndex(params string[] propertyNames)

例如

entityTypeBuilder
  .HasIndex("Name", "CategoryId")
  .IsUnique();

HasAlternateKey也一样:

entityTypeBuilder
  .HasAlternateKey("Name", "CategoryId");

作为 Ivan 出色回复的延伸:

如果预先定义外键,至少可以控制名称关联

const string auditForeignKey = "AuditId";
builder.HasOne(e => e.Audit)
       .WithMany(e => e.AuditLocations)
       .HasForeignKey(auditForeignKey);

builder.HasIndex(auditForeignKey, nameof(AuditLocation.LocationId)).IsUnique();