(23)ASP.NET Core EF关联数据库建模
2019-11-18杂谈搜奇网38°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; } }
参考文献:
表映照
列映照
数据范例
主键
默许架构
默许值
索引(关联数据库)