在 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();
我的实体 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();