GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
【 如果你想靠AI翻身,你先需要一个靠谱的工具! 】
一般而言,本部分中的配置适用于关系数据库。安装关系数据库提供程序时,此处显示的变为可用扩展方法(原因在于共享的Microsoft.EntityFrameworkCore.Relational包)。
表映射标识在数据库中哪张表应该进行内容查询和保存操作。
按照约定,每个实体将设置为映射到名称与DbSet<TEntity> 属性(公开派生上下文中的实体)相同的表中。如果给定DbSet<TEntity>实体中不包含,则使用类名称。
可以使用数据注释来配置类型映射表。
1 2 3 4 5 6 | [Table( "blogs" )] public class Blog { public int BlogId { get ; set ; } public string Url { get ; set ; } } |
你还可以指定表所属的架构(数据库)。
1 2 3 4 5 6 | [Table( "blogs" , Schema = "blogging" )] public class Blog { public int BlogId { get ; set ; } public string Url { get ; set ; } } |
你可以使用熟知的API来配置类型映射到的表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 ; } } |
你还可以指定表所属的架构(数据库)。
1 | modelBuilder.Entity<Blog>().ToTable( "blogs" , schema: "blogging" ); |
列映射标识在数据库中应从哪些列数据中进行查询和保存。
按照约定,每个属性将会设置为映射到与属性具有相同名称的列。
可以使用数据注释来配置属性映射到的那一列。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ; } } } |
您可以使用熟知的API来配置属性映射到的列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 ; } } } |
数据类型是指属性所映射到的列的数据库特定类型。
按照约定,数据库提供程序基于属性的.NET类型选择数据类型。它还会考虑其他元数据,如配置的最大长度、属性是否是主键的一部分等。例如,SQL Server的DateTime、nvarchar(max) 用作键的属性。
您可以使用数据注释为列指定精确的数据类型。例如,下面的代码将Url配置为一个非unicode字符串,其最大200长度。Rating为5至2小数位。
1 2 3 4 5 6 7 8 | 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 ; } } |
你还可以使用熟知的API为列指定相同的数据类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 ; } } |
为每个实体类型的键引入primary key(主键)约束。
按照约定,会将数据库中的主键命名为PK_<type name>。
不能使用数据批注配置主键的关系数据库的特定方面。
你可以使用API在数据库中配置primary key(主键)约束的名称。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 ; } } |
如果没有为该对象显式配置架构,则默认架构为将在其中创建对象的数据库架构。
按照约定,数据库提供程序将选择最适合的默认架构。例如,Microsoft SQL Server将使用dbo架构,而且sqlite将不使用架构(因为sqlite不支持架构)。
不能使用数据批注设置默认架构。
可以使用API来指定默认架构。
1 2 3 4 5 6 7 8 | class MyContext : DbContext { public DbSet<Blog> Blogs { get ; set ; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema( "blogging" ); } } |
如果插入新行,但没有为该列指定值,则列的默认值为要插入的值。
按照约定,未配置默认值。
不能使用数据批注设置默认值。
你可以使用API指定属性的默认值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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片段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 ; } } |
关系数据库中的索引映射到与实体框架核心中的索引相同的概念。
按照约定,索引命名为IX_<type name>_<property name>。对于复合索引<property name>,将成为以下划线分隔的属性名称列表。
不能使用数据批注配置索引。
你可以使用熟知的API来配置索引的名称。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 ; } } |
你还可以指定筛选器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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提供一个值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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索引中包含列,当查询中的所有列都作为键列或非键列包含在索引中时,可以通过包含列配置索引以显著提高查询性能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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为关系数据库建模的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。