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 / Sqlite 一对多关系在唯一索引约束上失败
EF Core SQLite 错误 19:尽管配置了一对多,但“外键约束失败”
如何首先将 EF Core 代码与 azure synapse 一起使用