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

gro*_*kky 10 entity-framework ef-migrations entity-framework-core ef-fluent-api

我需要一个复合唯一约束来实现我的实体的Name属性,它是唯一的Category(对于它有一个FK).

所以像这样:

entityTypeBuilder
  .HasIndex(i => new { i.Name, i.Category.Id })
  .IsUnique();
Run Code Online (Sandbox Code Playgroud)

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

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

我有什么选择?

ste*_*lla 9

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

  • 是的,但那很乱。这是唯一的选择吗? (5认同)
  • 为什么你觉得这很乱?添加外键属性并不乱,为什么这么认为?@grokky (2认同)
  • @grokky - 我认为不定义外键属性是混乱的.[EF docs推荐](https://docs.microsoft.com/en-us/ef/core/modeling/relationships#no-foreign-key-property),我宁愿不介绍阴影属性. (2认同)

Iva*_*oev 7

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

public virtual IndexBuilder HasIndex(params string[] propertyNames)
Run Code Online (Sandbox Code Playgroud)

例如

entityTypeBuilder
  .HasIndex("Name", "CategoryId")
  .IsUnique();
Run Code Online (Sandbox Code Playgroud)

同样的HasAlternateKey:

entityTypeBuilder
  .HasAlternateKey("Name", "CategoryId");
Run Code Online (Sandbox Code Playgroud)

  • 谁在读书.你不会失去静态类型.只需使用nameof(Type.Property) (3认同)