设为首页 加入收藏

TOP

asp.net core系列 27 EF模型配置(索引,备用键,继承)(一)
2019-09-17 18:02:15 】 浏览:37
Tags:asp.net core 系列 模型 配置 索引 备用 继承

一.索引

  索引是许多数据存储中的常见概念。虽然它们在数据存储中的实现可能会有所不同,但它们可用于更有效地基于列(或列集)进行查找。按照约定,用作外键每个属性 (或组的属性) 会自动创建索引。无法使用数据注释创建索引。

  

  1.1 非唯一索引

    Fluent API 在单个属性上指定索引。默认情况下,索引是非唯一的。如下代码示例在Blogs表上创建Url列索引:

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url);
    }
}

    

  1.2 唯一索引

    下面代码指定索引是唯一的,这是在索引上加了(Unique)唯一约束。

        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .IsUnique();

 

  1.3 复合索引

 class MyContext : DbContext
{
    public DbSet<People> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
           .HasIndex(p => new { p.FirstName, p.LastName });
    }
}

public class People
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address{get;set;}
}

    下面使用EF基于数据模型(People)创建数据表。在Migration中生成了索引的代码, 以及查看数据库People表的索引(官方文档中暂没有看到提供索引包含列设置)如下所示:

         name: "IX_People_FirstName_LastName",
         table: "People",
         columns: new[] { "FirstName", "LastName" });

      

 

二.备用键

         除主键之外,备用键用作每个实体实例的备用唯一标识符(跟主键一样具有唯一约束)。备用键可以用作关系的目标。当使用关系数据库时,这映射到备用键列上的唯一索引/约束的概念以及引用列的一个或多个外键约束。系统通常会在需要时为你引入备用键,你无需手动配置它们。不能使用数据注释配置备用键。

  

  2.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)
             //Post中创建BlogUrl外建字段
            .HasForeignKey(p => p.BlogUrl)
            //Blog中设置唯一约束备份键
            .HasPrincipalKey(b => b.Url);
    }
}

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; }
}

  上面主体实体Blog中Url属性作为备用键,创建了AK_Blogs_Url唯一非聚集索引。在依赖实体Post中创建了BlogUrl外键字段, 使用EF基于数据模型(Blog和Post实体)创建数据库,如下图所示。

  

  2.2 Fluent API

    可以使用Fluent API将单个属性配置为备用键。

    class MyContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>()
            //配置备用键(唯一非聚集索引)
            .HasAlternateKey(c => c.LicensePlate);

            //  创建复合备用键
            //  modelBuilder.Entity<Car>()
            // .HasAlternateKey(c => new { c.State, c.LicensePlate });
    }
}

class Car
{
    public int CarId { get; set; }
    public string LicensePlate { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public string State { get; set; }
}

 

三.继承

   EF 模型中的继承用于控制如何在数据库中表示实体类中的继承, 按照约定,由数据库提供程序决定如何在数据库中表示继承。有关如何使用关系数据库提供程序处理它,请查看”继承关系数据库“。如果模型中明确包含两个或多个继承类型,EF将仅设置继承。EF 不会扫描的基类或派生类型,可以在模型中包含类型,通过公开DbSet 继承层次结构中每个类型。不能使用数据注释来配置继承。

  

  3.1 约定

     下面示例中,有二个实体,通过公开Dbset类型,默认约定继承,如下所示:

class MyContext : DbContext
{
    public DbSet<Blog&
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ASP.NET写的一个博客系统 下一篇unity一个按钮实现开和关

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目