【问题标题】:EF Core - Add unique indexEF Core - 添加唯一索引
【发布时间】:2020-12-27 09:48:53
【问题描述】:

我正在对国家和城市进行 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

城市视图模型

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 个城市,名为悉尼。

如果我尝试创建或编辑另一个国家/地区以将其命名为加拿大或澳大利亚,我希望它给出错误。

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

希望对你有帮助。

【问题讨论】:

  • 您能否举例说明您希望允许的数据和不希望允许的数据?
  • @ESG 我提供了一个示例,希望对您有所帮助。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

您将需要 2 个唯一索引。

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

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

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

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

【讨论】:

  • 我试过了,现在我可以插入一个名称已经存在且城市名称保持不变的国家/地区
  • @ESG 您应该将该索引放在City 实体上,而不是Country
  • @ESG 它确实在 Cities 表中创建了一个 countryId 列,但我无法对 City 进行索引,因为我的类 City 中没有名为 CountryId 的属性。
  • @AndréMartins 以您现在的模型设置方式,看起来您拥有 EF 在幕后构建的隐含属性。您可能必须将 CountryId 添加到您的 City 模型中才能实现您的目标
猜你喜欢
  • 2017-01-11
  • 2015-07-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多