EF Core 2.1 Preview 2中如何创建含外键的复合唯一索引?
嘿,我来帮你搞定这个问题!你遇到的问题是EF Core不允许直接在HasIndex里引用导航属性的嵌套属性(比如p.Baz.Id),因为索引需要绑定到当前实体的直接属性上。下面给你两种可行的解决办法:
方法1:使用显式外键属性(推荐)
如果你的MyModel实体里已经定义了对应的外键属性(比如BazId),直接用这个属性构建复合索引就可以了,这也是EF Core的最佳实践。
首先确保实体类里有显式外键:
public class MyModel { public int Id { get; set; } public int BazId { get; set; } // 对应Baz导航属性的显式外键 public string Foo { get; set; } public string Bar { get; set; } public Baz Baz { get; set; } // 导航属性 }
然后修改OnModelCreating里的索引代码:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyModel>() .HasIndex(p => new { p.BazId, p.Foo, p.Bar }) .IsUnique(); }
方法2:使用影子外键属性(无显式外键时)
如果你的MyModel里没有显式定义外键属性,EF Core会自动生成一个影子属性(默认命名为BazId,对应导航属性Baz)。这时候可以用EF.Property方法访问这个影子属性来构建索引:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyModel>() .HasIndex(p => new { EF.Property<int>(p, "BazId"), p.Foo, p.Bar }) .IsUnique(); }
注意:如果之前你通过HasForeignKey指定了自定义的影子外键名(比如"CustomBazFK"),那索引里就要替换成对应的名称。
内容的提问来源于stack exchange,提问作者Ritmo2k
相关产品推荐
相关产品推荐

