我需要为我的实体Name
属性提供复合唯一约束,该属性对于Category
是唯一的(为此它具有FK)。
这样的事情:
entityTypeBuilder
.HasIndex(i => new { i.Name, i.Category.Id })
.IsUnique();
但是由于Category.Id
导航属性,我生成迁移时失败了。
我知道我可以将值硬编码为字符串,但我不想丢失静态类型。
我有哪些选择?
答案 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();