通常而言,本部分中的配置適用於關係數據庫。安裝關係數據庫提供程序時,此處顯示的變爲可用擴展方法(緣由在於共享的Microsoft.EntityFrameworkCore.Relational包)。sql
表映射標識在數據庫中哪張表應該進行內容查詢和保存操做。數據庫
按照約定,每一個實體將設置爲映射到名稱與DbSet<TEntity> 屬性(公開派生上下文中的實體)相同的表中。若是給定DbSet<TEntity>實體中不包含,則使用類名稱。架構
可使用數據註釋來配置類型映射表。框架
[Table("blogs")] public class Blog { public int BlogId { get; set; } public string Url { get; set; } }
你還能夠指定表所屬的架構(數據庫)。ide
[Table("blogs", Schema = "blogging")] public class Blog { public int BlogId { get; set; } public string Url { get; set; } }
你可使用熟知的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; } }
你還能夠指定表所屬的架構(數據庫)。ui
modelBuilder.Entity<Blog>().ToTable("blogs", schema: "blogging");
列映射標識在數據庫中應從哪些列數據中進行查詢和保存。spa
按照約定,每一個屬性將會設置爲映射到與屬性具備相同名稱的列。code
可使用數據註釋來配置屬性映射到的那一列。sqlite
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來配置屬性映射到的列。
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小數位。
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爲列指定相同的數據類型。
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(主鍵)約束的名稱。
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來指定默認架構。
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("blogging"); } }
若是插入新行,但沒有爲該列指定值,則列的默認值爲要插入的值。
按照約定,未配置默認值。
不能使用數據批註設置默認值。
你可使用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; } }
關係數據庫中的索引映射到與實體框架核心中的索引相同的概念。
按照約定,索引命名爲IX_<type name>_<property name>。對於複合索引<property name>,將成爲如下劃線分隔的屬性名稱列表。
不能使用數據批註配置索引。
你可使用熟知的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; } }