EF Core-添加唯一索引

时间:2020-09-09 01:28:31

标签: c# asp.net-core entity-framework-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

CityViewModel

public int CountryId { get; set; }


public int CityId { get; set; }


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

OnModelCreating

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

     base.OnModelCreating(modelBuilder);
}

示例

比方说,我有2个国家(地区)加拿大和澳大利亚,而在加拿大内有1个城市,名为悉尼。

如果我尝试创建或编辑另一个国家,以便将其命名为Canada或Australia,我希望它给出错误信息。

如果我尝试创建或编辑另一个城市,以便将其命名为悉尼,则如果该城市在澳大利亚国家/地区中创建,则不应给出错误,但如果在加拿大国家/地区中创建,则应给出错误。 / p>

我希望这会有所帮助。

1 个答案:

答案 0 :(得分:5)

您将需要2个唯一索引。

为防止多个国家使用相同的名称,您需要在其名称中使用唯一索引:

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

如果您还想防止同一个国家的多个城市具有相同的名称,并假设在“城市”表中有一个国家/地区ID(或代码),则可以在多个列上创建索引:

modelBuilder.Entity<City>().HasIndex(c => new { c.Name, c.CountryId }).IsUnique();