hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

(23)ASP.NET Core EF关联数据库建模

2019-11-18杂谈搜奇网30°c
A+ A-

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


参考文献:
表映照
列映照
数据范例
主键
默许架构
默许值
索引(关联数据库)

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
(23)ASP.NET Core EF关联数据库建模

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282301.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>