当前位置: 首页 > news >正文

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

参考文献:
表映射https://learn.microsoft.com/zh-cn/ef/core/modeling/entity-types?tabs=data-annotations
列映射https://learn.microsoft.com/zh-cn/ef/core/modeling/entity-properties?tabs=data-annotations%2Cwith-nrt#column-names
数据类型https://learn.microsoft.com/zh-cn/ef/core/modeling/entity-properties?tabs=data-annotations%2Cwith-nrt#column-data-types
主键https://learn.microsoft.com/zh-cn/ef/core/modeling/keys?tabs=data-annotations
默认架构https://learn.microsoft.com/zh-cn/ef/core/modeling/entity-types?tabs=data-annotations#table-schema
默认值https://learn.microsoft.com/zh-cn/ef/core/modeling/generated-properties?tabs=data-annotations#default-values
索引(关系数据库)https://learn.microsoft.com/zh-cn/ef/core/modeling/indexes?tabs=data-annotations

http://www.dtcms.com/a/409759.html

相关文章:

  • 【ArcGIS Pro微课1000例】0073:ArcGIS Pro3.5.2学习版下载及安装教程
  • flutter mixin
  • DevOps 工具链:CI/CD 概念解析 + Git 版本控制 + GitLab 仓库 + Jenkins 自动化全教程
  • flutter 使用dio发送本地https请求报错
  • 分享咖啡豆研磨机方案,MCU控制方案
  • flutter AudioPlayer的使用问题及处理
  • utf8mb4_bin、 utf8mb3_general_ci 、utf8mb4_0900_ai_ci 这几个有什么区别
  • 策划方案网站广告设计师证怎么考
  • 半导体制造中的等离子体是什么?
  • 南华 NHJX-13 型底盘间隙仪:机动车底盘安全检测的核心设备
  • 网站优化意义安徽省住房建设工程信息网站
  • 儿童安全座椅 - 背带专利拆解:可拆卸支撑部件的快扣接口结构与安全固定机制
  • 【安全】TLS 协议介绍
  • 【C++哲学】面向对象的三大特性之 继承
  • Spring Cloud Nacos 入门案例:从 0 到 1 实现服务注册与调用
  • 百度推广联系人网站搜索引擎优化主要方法
  • 网站备案 几年安装wordpress主题后 显示乱码 怎么解决
  • C++ 位运算 高频面试考点 力扣 01.01 判断字符是否唯一 题解 每日一题
  • LeetCode 2825.循环增长使字符串子序列等于另一个字符串
  • JUC CountDownLatch源码详解
  • Unity-动画IK控制
  • 华天软件Inforcenter PLM uploadFileTolls接口存在任意文件上传漏洞
  • FT2000/4核Linux下GPIO中断调试说明
  • 从后端到react框架
  • 几个Linux系统安装体验: 银河麒麟服务器系统V11
  • 金仓数据库打通电子证照国产化“最后一公里”——福建某地2TB MongoDB无缝迁移实践
  • 宁波网站建设明细报价上海红蚂蚁装潢设计有限公司
  • 罗田企业网站建设在贸易网站怎么做贸易
  • 前端登录加密实战:从原理到落地,守护用户密码安全
  • 公司网站域名申请流程江苏营销型网站建设