EF是否可以使用阴影属性创建Mutli-column索引?

N. *_*nné 7 c# sqlite entity-framework entity-framework-core ef-fluent-api

我正在尝试使用shadow属性创建多列唯一索引。我知道我可以通过添加属性来解决此问题,但是我想看看是否有可能做到这一点,而不需要保持模型清洁。

要创建多列索引,您可以在Fluent API中使用以下选项:

modelBuilder.Entity<AlbumTrack>().HasIndex(t => new { t.TrackNumber, t.AlbumId).IsUnique();
Run Code Online (Sandbox Code Playgroud)

但是我不想用额外的AlbumId属性使我的模型混乱,因此不想使用shadow属性,对于单个列,这是可行的:

modelBuilder.Entity<AlbumTrack>().HasIndex(t => EF.Property<int>(t,"AlbumId")).IsUnique();
Run Code Online (Sandbox Code Playgroud)

但是对于使用阴影属性的多列索引,如下所示

modelBuilder.Entity<AlbumTrack>()
    .HasIndex(t => new { t.TrackNumber, EF.Property<int>(t,"AlbumId")})
    .IsUnique();
Run Code Online (Sandbox Code Playgroud)

我在vscode中收到以下错误

无效的匿名类型成员声明符。必须使用成员分配,简单名称或成员访问来声明匿名类型成员。

任何人都有一个想法,如何使用阴影属性来做到这一点,还是不可能?

Iva*_*oev 7

这是可能的。您可以通过简单地使用HasIndex重载params string[] propertyNames

首先确保阴影属性已定义:

modelBuilder.Entity<AlbumTrack>()
    .Property<int>("AlbumId");
Run Code Online (Sandbox Code Playgroud)

然后定义索引:

modelBuilder.Entity<AlbumTrack>()
    .HasIndex("TrackNumber", "AlbumId")
    .IsUnique();
Run Code Online (Sandbox Code Playgroud)