Могу ли я добавить первичный ключ и уникальное ограничение в EFCore - PullRequest
0 голосов
/ 06 мая 2019

Я вручную перехожу из .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.

IЯ пытался сделать что-то вроде хакерской работы вокруг

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

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

Снова, добавление этой записи дважды кажется небольшим недостатком… Кажется, что Fluent хочет просто связать методы в цепочку.на этом, но я очень теряюсь.Можно ли добавить как первичный ключ, так и ограничение уникальности?

1 Ответ

1 голос
/ 06 мая 2019

Лучше отделить свои конфигурации сущностей от метода OnModelCreating с помощью интерфейса IEntityTypeConfiguration следующим образом:

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

Теперь вы можете добавить конфигурацию для всех ваших Db-сущностей, таких как PersonConfiguration, и зарегистрировать их все сразу, как указано ниже:

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

Это даст вам больше разделения внимания и читабельности!

...