在EF Core中生成复合唯一约束/索引

时间:2016-11-23 15:10:12

标签: entity-framework entity-framework-core ef-migrations ef-fluent-api

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

这样的事情:

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

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

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

我有哪些选择?

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

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

public virtual IndexBuilder HasIndex(params string[] propertyNames)

e.g。

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

HasAlternateKey相同:

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

答案 2 :(得分:0)

作为对Ivan出色反应的扩展:

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

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

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