我可以在 EFCore 中添加主键和唯一约束吗

MyD*_*ons 1 entity-framework-core asp.net-core-2.2

我正在手动从 .NET Framework 迁移到 .NET Core 并处理 EF 和 DTO。

\n\n

我不喜欢这个 - 我读过注释不支持索引,因此,目前我正在混合流畅的 api 和注释,这是一种代码味道。然而,看来我必须继续进行这种组合。

\n\n

我的问题是我是否只能通过流畅的 api 来实现这一点。我的表既有主键又有唯一约束。

\n\n

我的对象看起来像

\n\n
class Person\n{\n    public int Id {get;set;}\n    public string UniqueToken {get;set;}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,我无法添加以下内容

\n\n
modelBuilder.Entity<Person>()\n            .HasKey(a => a.Id)\n            .HasIndex(a => a.UniqueToken).IsUnique();  //this is what I would like to add but I can't.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过一些感觉像是一种棘手的解决方法

\n\n
modelBuilder.Entity<Person>()\n            .HasKey(a => a.Id);\n\nmodelBuilder.Entity<Person>()\n            .HasIndex(a => a.UniqueToken).IsUnique();  \n
Run Code Online (Sandbox Code Playgroud)\n\n

同样,添加此条目两次似乎有点 bleug\xe2\x80\xa6 Fluent 似乎想要简单地链接这些方法。

\n\n

我读过这篇文章,但我很迷失。是否可以同时添加主键和唯一约束?

\n

Tan*_*jel 5

最好将实体配置OnModelCreating与接口方法分开IEntityTypeConfiguration,如下所示:

public class PersonConfiguration : IEntityTypeConfiguration<Person>
{
    public void Configure(EntityTypeBuilder<Person> builder)
    {
        builder.HasKey(a => a.Id);
        builder.HasIndex(a => a.UniqueToken).IsUnique();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以为所有数据库实体添加配置PersonConfiguration,并立即注册所有实体,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.ApplyConfigurationsFromAssembly(typeof(PersonConfiguration).Assembly);
}
Run Code Online (Sandbox Code Playgroud)

这将为您提供更多关注点和可读性的分离!