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

时间:2019-05-06 06:23:59

标签: entity-framework-core asp.net-core-2.2

我正在从.NET Framework手动迁移到.NET Core,并致力于EF和DTO。

我不喜欢这个-我已经读过注释不支持索引,因此,目前正在将流利的api和注释混合在一起,这是代码的味道。但是,似乎我必须继续进行此组合。

我的问题是我是否只能使用流利的api才能实现这一目标。我的表既有主键又有唯一的约束。

我的对象看起来像

class Person
{
    public int Id {get;set;}
    public string UniqueToken {get;set;}
}

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

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

我尝试了一些似乎很棘手的工作

modelBuilder.Entity<Person>()
            .HasKey(a => a.Id);

modelBuilder.Entity<Person>()
            .HasIndex(a => a.UniqueToken).IsUnique();  

再次,两次添加此条目似乎有点麻烦……Fluent似乎只想简单地链接方法。

我已经阅读过此书,但我却迷失了。是否可以同时添加主键和唯一约束?

1 个答案:

答案 0 :(得分:1)

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

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

现在,您可以为PersonConfiguration之类的所有Db实体添加配置,并立即注册所有它们,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.ApplyConfigurationsFromAssembly(typeof(PersonConfiguration).Assembly);
}

这将使您更加关注和易读!