zoukankan      html  css  js  c++  java
  • (23)ASP.NET Core2.2 EF关系数据库建模

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


    参考文献:
    表映射
    列映射
    数据类型
    主键
    默认架构
    默认值
    索引(关系数据库)

  • 相关阅读:
    Python-02 可视化之tkinter介绍
    Python-01矩阵、数组和列表等的总结
    嵌入式文件IO实验
    Linux 学习
    linux 学习
    Linux学习
    Linux学习
    Linux 学习
    Linux 学习
    Linux 用户权限学习
  • 原文地址:https://www.cnblogs.com/wzk153/p/11796464.html
Copyright © 2011-2022 走看看