EF Core — добавление уникального индекса

Я делаю CRUD стран и городов и пытаюсь добавить уникальный индекс в City.Name.

Я уже сделал это с Country.Name, и я хотел бы знать, возможно ли сделать это с городом, чтобы 2 города в 2 странах могли иметь одно и то же имя, но в 1 стране не может быть городов с повторяющимися названиями.

Класс страны

public int Id { get; set; }

[Required]
public string Name { get; set; }

public ICollection<City> Cities { get; set; }

Городской класс

public int Id { get; set; }

[Required]
public string Name { get; set; }

Когда я создаю город, я использую эту ViewModel

Модель CityView

public int CountryId { get; set; }


public int CityId { get; set; }


[Required]
public string Name { get; set; }

При создании модели

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     modelBuilder.Entity<Country>().HasIndex(c => c.Name).IsUnique();

     base.OnModelCreating(modelBuilder);
}

Пример

Допустим, у меня есть 2 страны Канада и Австралия, а внутри Канады у меня есть 1 город по имени Сидней.

Если я попытаюсь создать или отредактировать другую страну, чтобы она называлась Канада или Австралия, я хочу, чтобы она выдавала ошибку.

Если я попытаюсь создать или отредактировать другой город, чтобы он назывался Сидней, если город создан в стране Австралия, он не должен выдавать ошибку, но если он создан в стране Канада, он должен выдавать ошибку.

Я надеюсь, что это помогает.


person André Martins    schedule 09.09.2020    source источник
comment
Можете ли вы включить пример данных, которые вы хотели бы разрешить, и данных, которые вы не хотите?   -  person ESG    schedule 09.09.2020
comment
@ESG Я включил пример, надеюсь, он поможет.   -  person André Martins    schedule 09.09.2020


Ответы (1)


Вам понадобятся 2 уникальных индекса.

Чтобы несколько стран не имели одинакового имени, вам нужен уникальный индекс в его имени:

modelBuilder.Entity<Country>().HasIndex(c => c.Name ).IsUnique();

Если вы также хотите, чтобы несколько городов в одной и той же стране не имели одинаковых названий, предполагая, что у вас есть идентификатор (или код) страны в таблице Cities, вы можете создать индекс для нескольких столбцов:

modelBuilder.Entity<City>().HasIndex(c => new { c.Name, c.CountryId }).IsUnique();
person ESG    schedule 09.09.2020
comment
Я попробовал и теперь могу вставить страну с уже существующим названием, а про город оно осталось прежним - person André Martins; 09.09.2020
comment
@ESG, вы должны поместить этот индекс на сущность City, а не на Country - person Panagiotis Kanavos; 09.09.2020
comment
@ESG создает столбец countryId в таблице Cities, но я не могу сделать этот индекс для City, потому что у меня нет свойства с именем CountryId в моем классе City. - person André Martins; 09.09.2020
comment
@AndréMartins То, как вы сейчас настроили свою модель, похоже, что у вас есть подразумеваемое свойство, которое EF создает за кулисами. Возможно, вам придется добавить CountryId в модель вашего города, чтобы достичь своей цели. - person ESG; 09.09.2020