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> 为下划线分隔属性名称的列表
posted @ 2020-02-13 23:46  前线码农  阅读(1014)  评论(0编辑  收藏  举报