在EF核心中生成复合唯一的约束/索引



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

这样的东西:

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

但是,由于Category.Id导航属性,我会生成迁移时失败。

我知道我可以用作字符串的值,但我不想丢失静态键入。

我有哪些选项?

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

public virtual IndexBuilder HasIndex(params string[] propertyNames)

,例如

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

HasAlternateKey相同:

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

在有问题的实体上添加一个 CategoryId类别的外键,并在索引构建器中使用它而不是导航属性。

作为伊万(Ivan)出色响应的扩展:

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

const string auditForeignKey = "AuditId";
builder.HasOne(e => e.Audit)
       .WithMany(e => e.AuditLocations)
       .HasForeignKey(auditForeignKey);
builder.HasIndex(auditForeignKey, nameof(AuditLocation.LocationId)).IsUnique();

详细答案仅在帖子的评论中

所以我想分享如果您不想失去静态键入,可以使用的实际代码:

entityTypeBuilder
  .HasIndex(nameof(MyType.Name), nameof(MyType.CategoryId))
  .IsUnique();

或:

entityTypeBuilder
  .HasAlternateKey(nameof(MyType.Name), nameof(MyType.CategoryId));

相关内容

  • 没有找到相关文章

最新更新