ASP.NET Core使用EF为关系数据库建模

目录
  • 1.简介
  • 2.表映射
    • 2.1约定
    • 2.2数据注释
    • 2.3Fluent API
  • 3.列映射
    • 3.1约定
    • 3.2数据注释
    • 3.3Fluent API
  • 4.数据类型
    • 4.1约定
    • 4.2数据注释
    • 4.3Fluent API
  • 5.主键
    • 5.1约定
    • 5.2数据注释
    • 5.3Fluent API
  • 6.默认架构
    • 6.1约定
    • 6.2数据注释
    • 6.3Fluent API
  • 7.默认值
    • 7.1约定
    • 7.2数据注释
    • 7.3Fluent API
  • 8.索引(关系数据库)
    • 8.1约定
    • 8.2数据注释
    • 8.3Fluent API

1.简介

一般而言,本部分中的配置适用于关系数据库。安装关系数据库提供程序时,此处显示的变为可用扩展方法(原因在于共享的Microsoft.EntityFrameworkCore.Relational包)。

2.表映射

表映射标识在数据库中哪张表应该进行内容查询和保存操作。

2.1约定

按照约定,每个实体将设置为映射到名称与DbSet<TEntity> 属性(公开派生上下文中的实体)相同的表中。如果给定DbSet<TEntity>实体中不包含,则使用类名称。

2.2数据注释

可以使用数据注释来配置类型映射表。

[Table("blogs")]
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

你还可以指定表所属的架构(数据库)。

[Table("blogs", Schema = "blogging")]
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

2.3Fluent API

你可以使用熟知的API来配置类型映射到的表。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .ToTable("blogs");
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

你还可以指定表所属的架构(数据库)。

modelBuilder.Entity<Blog>().ToTable("blogs", schema: "blogging");

3.列映射

列映射标识在数据库中应从哪些列数据中进行查询和保存。

3.1约定

按照约定,每个属性将会设置为映射到与属性具有相同名称的列。

3.2数据注释

可以使用数据注释来配置属性映射到的那一列。

namespace EFModeling.DataAnnotations.Relational.Column
{
    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
    }
    public class Blog
    {
        [Column("blog_id")]
        public int BlogId { get; set; }
        public string Url { get; set; }
    }
}

3.3Fluent API

您可以使用熟知的API来配置属性映射到的列。

namespace EFModeling.FluentAPI.Relational.Column
{
    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>()
                .Property(b => b.BlogId)
                .HasColumnName("blog_id");
        }
    }
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
    }
}

4.数据类型

数据类型是指属性所映射到的列的数据库特定类型。

4.1约定

按照约定,数据库提供程序基于属性的.NET类型选择数据类型。它还会考虑其他元数据,如配置的最大长度、属性是否是主键的一部分等。例如,SQL Server的DateTime、nvarchar(max) 用作键的属性。

4.2数据注释

您可以使用数据注释为列指定精确的数据类型。例如,下面的代码将Url配置为一个非unicode字符串,其最大200长度。Rating为5至2小数位。

public class Blog
{
    public int BlogId { get; set; }
    [Column(TypeName = "varchar(200)")]
    public string Url { get; set; }
    [Column(TypeName = "decimal(5, 2)")]
    public decimal Rating { get; set; }
}

4.3Fluent API

你还可以使用熟知的API为列指定相同的数据类型。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>(eb =>
        {
            eb.Property(b => b.Url).HasColumnType("varchar(200)");
            eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");
        });
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public decimal Rating { get; set; }
}

5.主键

为每个实体类型的键引入primary key(主键)约束。

5.1约定

按照约定,会将数据库中的主键命名为PK_<type name>。

5.2数据注释

不能使用数据批注配置主键的关系数据库的特定方面。

5.3Fluent API

你可以使用API在数据库中配置primary key(主键)约束的名称。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasKey(b => b.BlogId)
            .HasName("PrimaryKey_BlogId");
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

6.默认架构

如果没有为该对象显式配置架构,则默认架构为将在其中创建对象的数据库架构。

6.1约定

按照约定,数据库提供程序将选择最适合的默认架构。例如,Microsoft SQL Server将使用dbo架构,而且sqlite将不使用架构(因为sqlite不支持架构)。

6.2数据注释

不能使用数据批注设置默认架构。

6.3Fluent API

可以使用API来指定默认架构。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("blogging");
    }
}

7.默认值

如果插入新行,但没有为该列指定值,则列的默认值为要插入的值。

7.1约定

按照约定,未配置默认值。

7.2数据注释

不能使用数据批注设置默认值。

7.3Fluent API

你可以使用API指定属性的默认值。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Rating)
            .HasDefaultValue(3);
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public int Rating { get; set; }
}

还可以指定用于计算默认值的SQL片段。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Created)
            .HasDefaultValueSql("getdate()");
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public DateTime Created { get; set; }
}

8.索引(关系数据库)

关系数据库中的索引映射到与实体框架核心中的索引相同的概念。

8.1约定

按照约定,索引命名为IX_<type name>_<property name>。对于复合索引<property name>,将成为以下划线分隔的属性名称列表。

8.2数据注释

不能使用数据批注配置索引。

8.3Fluent API

你可以使用熟知的API来配置索引的名称。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .HasName("Index_Url");
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

你还可以指定筛选器。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .HasFilter("[Url] IS NOT NULL");
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

使用SQL Server提供程序EF为唯一索引中包含的所有可以为null的列添加"IS NOT NULL"筛选器。若要重写此约定,可以null提供一个值。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasIndex(b => b.Url)
            .IsUnique()
            .HasFilter(null);
    }
}
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

在SQL Server索引中包含列,当查询中的所有列都作为键列或非键列包含在索引中时,可以通过包含列配置索引以显著提高查询性能。

class MyContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasIndex(p => p.Url)
            .IncludeProperties(p => new
            {
                p.Title,
                p.PublishedOn
            })
            .HasName("Index_Url_Include_Title_PublishedOn");
    }
}
public class Post
{
    public int PostId { get; set; }
    public string Url { get; set; }
    public string Title { get; set; }
    public DateTime PublishedOn { get; set; }
}

到此这篇关于ASP.NET Core使用EF为关系数据库建模的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET Core使用EF查询数据

    1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成给数据库可识别数据形式). 发送的查询结果(查询表示形式)会被缓存,以便每次执行查询时无需进行1.1中处理. 1.2查询结果(查询表示形式)会传递到数据库提供程序 数据库提供程序会识别出查询的哪些部分可以在数据库中求值. 查询的这些部分会转换为特定数据库的查询语言(例如,关系数据库的T-SQL).

  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    目录 1.简介 2.基本保存 2.1添加数据 2.2更新数据 2.3删除数据 2.4单个SaveChanges中的多个操作 3.保存关联数据 3.1添加关联数据 3.2添加相关实体 3.3更改关系 4.级联删除 5.事务 5.1控制事务 1.简介 每个上下文实例都有一个ChangeTracker,它负责跟踪需要写入数据库的更改.更改实体类的实例时,这些更改会记录在ChangeTracker中,然后在调用SaveChanges时会被写入数据库中.此数据库提供程序负责将更改转换为特定于数据库的操作(

  • ASP.NET Core使用EF创建模型(索引、备用键、继承、支持字段)

    目录 1.索引 1.1约定 1.2数据批注 1.3Fluent API 2.备用键 2.1约定 2.2数据注释 2.3Fluent API 3.继承 3.1约定 4.支持字段 4.1约定 4.2数据注释 4.3Fluent API 4.3.1控制何时使用字段 4.3.2没有属性的字段 1.索引 索引是跨多个数据存储区的常见概念.尽管它们在数据存储中的实现可能会有所不同,但也可用于基于列(或一组列)更高效地进行查找. 1.1约定 按照约定,将在用作外键的每个属性(或一组属性)中创建索引. 1.2数

  • ASP.NET Core使用EF创建关系模型

    目录 1.关系 2.术语定义 3.约定 4.完全定义的关系 5.无外键属性 6.单个导航属性 7.数据注释 7.1ForeignKey 7.2InverseProperty 8.Fluent API 8.1单个导航属性 8.2ForeignKey 8.3无导航属性 9.主体密钥 10.必需和可选的关系 11.级联删除 12.其他关系模式 12.1一对一 12.1.1数据注释 12.1.2Fluent API 12.2多对多 1.关系 关系定义两个实体之间的关系.在关系型数据库中,这由外键约束表示

  • ASP.NET Core使用EF创建模型(必需和可选属性、最大长度、并发标记、阴影属性)

    目录 1.必需和可选属性 1.1约定 1.2数据批注 1.3Fluent API 2.最大长度 2.1约定 2.2数据批注 2.3Fluent API 3.并发标记 3.1约定 3.2数据注释 3.3Fluent API 4.时间戳/行版本 4.1约定 4.2数据注释 4.3Fluent API 5.阴影属性 5.1约定 5.2数据注释 5.3Fluent API 1.必需和可选属性 如果实体属性可以包含null,则将其视为可选.如果属性的有效值不可以包含null,则将其视为必需属性.映射到关系

  • ASP.NET Core使用EF创建模型

    目录 1.什么是Fluent API? 2.包含属性和排除属性 2.1包含属性 2.2排除属性 2.2.1数据批注 2.2.2Fluent API 3.主键 3.1数据批注 3.2Fluent API 4.生成值 4.1数据批注 4.1.1无值生成 4.1.2在添加时生成值 4.1.3在添加或更新时生成值 4.2Fluent API 4.2.1无值生成 4.2.2在添加时生成值 4.2.3在添加或更新时生成值 1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无

  • EF Core通过显式编译提高查询性能

    今天,我将向您展示这些EF Core中一个很酷的功能,通过使用显式编译的查询,提高查询性能. 不过在介绍具体内容之前,需要说明一点,EF Core已经对表达式的编译使用了缓存:当您的代码需要重用以前执行的查询时,EF Core将使用哈希查找并从缓存中返回已编译的查询. 不过,您可能希望直接对查询进行编译,跳过哈希的计算和缓存查找.我们可以通过在EF静态类中下面两个方法来实现: EF.CompileQuery() EF.CompileAsyncQuery() 这些方法允许您定义一个已编译的查询,然

  • ASP.NET Core基于现有数据库创建EF模型

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序,对现有数据库进行反向工程以便创建Entity Framework模型. 2.创建数据库 我们可以通过Visual Studio创建一个数据库再进行演示,步骤如下:●打开Visual Studio开发工具●“工具”>“连接到数据库”●选择“Microsoft SQL Ser

  • ASP.NET Core使用EF为关系数据库建模

    目录 1.简介 2.表映射 2.1约定 2.2数据注释 2.3Fluent API 3.列映射 3.1约定 3.2数据注释 3.3Fluent API 4.数据类型 4.1约定 4.2数据注释 4.3Fluent API 5.主键 5.1约定 5.2数据注释 5.3Fluent API 6.默认架构 6.1约定 6.2数据注释 6.3Fluent API 7.默认值 7.1约定 7.2数据注释 7.3Fluent API 8.索引(关系数据库) 8.1约定 8.2数据注释 8.3Fluent A

  • ASP.NET Core使用EF为关系数据库建模

    目录 1.简介 2.表映射 2.1约定 2.2数据注释 2.3Fluent API 3.列映射 3.1约定 3.2数据注释 3.3Fluent API 4.数据类型 4.1约定 4.2数据注释 4.3Fluent API 5.主键 5.1约定 5.2数据注释 5.3Fluent API 6.默认架构 6.1约定 6.2数据注释 6.3Fluent API 7.默认值 7.1约定 7.2数据注释 7.3Fluent API 8.索引(关系数据库) 8.1约定 8.2数据注释 8.3Fluent A

  • ASP.NET Core使用EF创建模型(包含属性、排除属性、主键和生成值)

    目录 1.什么是Fluent API? 2.包含属性和排除属性 2.1包含属性 2.2排除属性 2.2.1数据批注 2.2.2Fluent API 3.主键 3.1数据批注 3.2Fluent API 4.生成值 4.1数据批注 4.1.1无值生成 4.1.2在添加时生成值 4.1.3在添加或更新时生成值 4.2Fluent API 4.2.1无值生成 4.2.2在添加时生成值 4.2.3在添加或更新时生成值 1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无

  • ASP.NET Core使用EF SQLite对数据库增删改查

    SQLIte 操作方便,简单小巧,这里笔者就不再过多介绍,感兴趣可以到以下博文 https://www.jb51.net/article/234142.htm 文章介绍创建ASP.NET Core 程序,创建模型.上下文,生成数据库,对数据库增删查改. 并对每个过程进行详细介绍,使初学者尽快了解内容和相关知识,避免对某一知识点怀疑.卡在某个位置. 1 新建ASP.NET Core MVC 应用 1.1 新建MVC应用 打开Visual Studio 2017,新建 ASP.NET Web应用程序

随机推荐