我需要对我实体的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));