asp.net core系列 27 EF模型配置(索引,备用键,继承)

一.索引

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

  

  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> Blogs { get; set; }
    public DbSet<RssBlog> RssBlogs { get; set; }
}

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

public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}

    使用EF基于数据模型(Blog和RssBlog实体)创建数据库。生成后,两个实体合并到一个Blogs表中,如下所示:

    

    

  3.2  Fluent API

    如果您不想公开DbSet对于层次结构中的一个或多个实体,您可以使用Fluent API确保它们包含在模型中。如果您不依赖约定,则可以使用明确指定基类型HasBaseType。 

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RssBlog>().HasBaseType<Blog>();
    }
}

  3.3 discriminator隐藏属性

    上面3.1示例中,创建了discriminator辨别者隐藏属性,是基于base entity的层级。因为它是模型中的一个属性,所以可以像配置其他属性一样配置它。例如,要设置默认情况下的最大长度。

modelBuilder.Entity<Blog>()
         .Property("Discriminator")
            .HasMaxLength(200);

    discriminator鉴别器也可以映射到实体中的实际CLR属性

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasDiscriminator<string>("BlogType");
    }
}

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

public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}

  参考文献:

    官方文档:EF索引

           EF备用键

         EF继承

         EF继承(关系数据库)

原文地址:https://www.cnblogs.com/MrHSR/p/10399692.html

时间: 2024-11-08 11:51:02

asp.net core系列 27 EF模型配置(索引,备用键,继承)的相关文章

asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)

原文:asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型) 一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent API为属性配置支持字段. 1.1 约定 public class Blog { // _<camel-cased property name> private string _url; public int

asp.net core系列 30 EF管理数据库架构--必备知识 迁移

原文:asp.net core系列 30 EF管理数据库架构--必备知识 迁移 一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为准,请使用迁移. 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与 EF Core 模型兼容.  (2)如果希望以数据库架构为准,请使用反向工程. 使用此方法,可通过将数

asp.net core 系列 20 EF基于数据模型创建数据库

原文:asp.net core 系列 20 EF基于数据模型创建数据库 一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种code first模式.可以在Windows 上使用 Visual Studio 2017,或在 Windows.macOS 或 Linux 上使用 .NET Core CLI 来学习.已经安装了NET Core 2.1 SDK,这

asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

原文:asp.net core 系列 22 EF(连接字符串,连接复原,DbContext) 一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json.用户机密存储.其他配置源中. 下面示例演示appsettings.json 中存储的连接字符串,这样不管asp.net core在什么环境(Development.Staging .Production)

asp.net core系列 32 EF查询数据 必备知识(1)

一.查询的工作原理 Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据. 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)基于派生上下文和实体类编写强类型查询. LINQ 查询的表示形式会传递给数据库提供程序,进而转换为特定的数据库查询语言(例如,适用于关系数据库的 SQL). 1.1 查询的生命周期, 下面是每个查询所经历的过程概述: (1) LINQ 查询由 E F处理,用于生成已准备好的表示形式,由数据库提供程序处理.缓存结果,以

asp.net core系列 35 EF保存数据(2) -- EF系列结束

一.事务 (1) 事务接着上篇继续讲完.如果使用了多种数据访问技术,来访问关系型数据库,则可能希望在这些不同技术所执行的操作之间共享事务.下面示例显示了如何在同一事务中执行 ADO.NET SqlClient 操作和 Entity Framework Core 操作. using (var connection = new SqlConnection(connectionString)) { //使用ado.net 打开数据库连接 connection.Open(); //使用ado.net 开

目录导航「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 入门篇 1.1课程介绍「深入浅出ASP.NET Core系列」 1.2环境安装「深入浅出ASP.NET Core系列」 1.3创建项目「深入浅出ASP.NET Core系列」 1.4部署到IIS「深入浅出ASP.NET Core系列」 1.5准备CentOS和Nginx环境「深入浅出ASP.NET Core系列」 1.6部署到CentOS「深入浅出ASP.NET Core系列」 2.1命令行和JSON的配置「深

asp.net core系列 48 Identity 身份模型自定义

原文:asp.net core系列 48 Identity 身份模型自定义 一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户. Identity添加到项目时单个用户帐户选择作为身份验证机制. 默认情况下,Identity可以使用的 Entity Framework (EF) Core 数据模型. 本文介绍如何自定义的身份标识模型. 1.1 下面是已经存在的身份模型, 由以下实体类型组成: 实体类型 说明 关系 Use

asp.net core系列 36 WebAPI 搭建详细示例

原文:asp.net core系列 36 WebAPI 搭建详细示例 一.概述 HTTP不仅仅用于提供网页.HTTP也是构建公开服务和数据的API强大平台.HTTP简单灵活且无处不在.几乎任何你能想到的平台都有一个HTTP库,因此HTTP服务可以覆盖广泛的客户端,包括浏览器,移动设备和传统的桌面应用程序. ASP.NET Web API 是一个框架,基于.NET Framework 或.NET Core 之上构建 Web API. 从本章开始学习Web API系列时,先从一个示例开始,下面使用A