文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-29 22:36

关注

本文小编为大家详细介绍“ASP.NET Core如何使用EF为关系数据库建模”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.NET Core如何使用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; }}

读到这里,这篇“ASP.NET Core如何使用EF为关系数据库建模”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯