9. EF Core数据库索引与备用键约束

Posted adoni

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9. EF Core数据库索引与备用键约束相关的知识,希望对你有一定的参考价值。

一、设置索引

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>().HasIndex(b => b.Url); //Url字段索引
modelBuilder.Entity<Blog>() .HasIndex(b => b.Url) .IsUnique();
//Url字段的唯一索引
modelBuilder.Entity<Blog>().HasIndex(b => b.Url).HasName("Index_Url"); //设置索引名为Index_Url
modelBuilder.Entity<Blog>().HasIndex(b => b.Url).HasFilter("过滤条件"); //复合条件的数据建立索引 HasFilter里面填写 where 条件。HasFilter(null) 所有数据建立索引
modelBuilder.Entity<Person>() .HasIndex(p => new { p.FirstName, p.LastName }); //创建多个列的索引
 }

 

二、备用键:除主键之外,备用键也能唯一标识一条数据(跟主键一样具有唯一约束)。备用键可以用作外键关系的目标。当使用关系数据库时,系统通常会在需要时默认你引入备用键,你无需手动配置它们,当然也可以手动配置

1、约定设定:按照约定,当您标识的属性不是作为关系目标的主键时,将为您引入备用键

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogUrl)
            .HasPrincipalKey(b => b.Url); //不需要设置Url为备用键,EF Core会设置
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public string BlogUrl { get; set; }
    public Blog Blog { get; set; }
}

2、手动设置:Fluent API 可用于手动配置要作为备用键的单个属性

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
  .HasAlternateKey(c
=> c.LicensePlate) //单个属性备用键
.HasName("AlternateKey_LicensePlate"); //设置备用键名
    modelBuilder.Entity<Car>() .HasAlternateKey(c => new { c.State, c.LicensePlate }); //设置复合备用键
}
注:按照约定,备用键的索引和约束被命名为 AK_<type name>_<property name> 格式, 备用组合键 <property name> 为下划线分隔属性名称的列表

以上是关于9. EF Core数据库索引与备用键约束的主要内容,如果未能解决你的问题,请参考以下文章

在 EF Core 中生成复合唯一约束/索引

EF Core / Sqlite 一对多关系在唯一索引约束上失败

EF Core SQLite 错误 19:尽管配置了一对多,但“外键约束失败”

如何首先将 EF Core 代码与 azure synapse 一起使用

EF Core 中是不是有用于唯一约束的数据注释(代码优先)?

EF Core 迁移:在存在时删除唯一约束