本文翻譯自《Entity Framework Core: Naming Convention》,由於水平有限,故無法保證翻譯完全正確,歡迎指出錯誤。謝謝!
注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版發布時,功能可能存在變動。
Entity Framework 遷移允許從模型生成數據庫,這意味着必須從類名和屬性名生成數據庫對象的名稱。對於大多數人來說使用默認名稱是沒有問題的,但是,您的DBA可能會要求您使用特定的命名約定。例如,一些DBA希望表名大寫,或者列名使用表名為前綴。
Entity Framework 允許逐個設置表名或列名:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().ForSqlServerToTable("Blog");
}
但是,寫這些代碼非常無聊並且容易出錯,不應該逐個設置對像的名稱,您可以通過修改模型實現全局設置。事實上modelBuilder
是可讀寫的,您可以迭代所有對象並更改其名稱。
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Singularize table name
// Blogs => Blog
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
// Add NuGet package "Humanizer" to use Singularize()
entityType.Relational().TableName = entityType.Relational().TableName.Singularize();
}
// Prefix column names with table name
// Id => Blog_Id
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
property.Relational().ColumnName = entityType.Relational().TableName + "_" + property.Relational().ColumnName;
}
}
// Rename Foreign Key
// FK_Post_Blog_BlogId => FK_Post_Blog_BlogId_Test
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
foreach (var fk in entityType.FindForeignKeys(property))
{
fk.Relational().Name = fk.Relational().Name + "_Test";
}
}
}
// Rename Indices
// IX_Blog_Url => IX_Blog_Url_Test
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var index in entityType.GetIndexes())
{
index.Relational().Name = index.Relational().Name + "_Test";
}
}
}
}
在 Package Manager Console 中運行以下命令:
Add-Migration NamingConvention
Update-Database
上面的命令將生成以下數據庫架構:
CREATE TABLE [dbo].[Blog] (
[Blog_BlogId] INT IDENTITY (1, 1) NOT NULL,
[Blog_Url] NVARCHAR (450) NULL,
CONSTRAINT [PK_Blog] PRIMARY KEY CLUSTERED ([Blog_BlogId] ASC)
);
CREATE UNIQUE NONCLUSTERED INDEX [IX_Blog_Url_Test]
ON [dbo].[Blog]([Blog_Url] ASC) WHERE ([Blog_Url] IS NOT NULL);
CREATE TABLE [dbo].[Post] (
[Post_PostId] INT IDENTITY (1, 1) NOT NULL,
[Post_BlogId] INT NOT NULL,
[Post_Content] NVARCHAR (MAX) NULL,
[Post_Title] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED ([Post_PostId] ASC),
CONSTRAINT [testFK_Post_Blog_BlogId] FOREIGN KEY ([Post_BlogId]) REFERENCES [dbo].[Blog] ([Blog_BlogId]) ON DELETE CASCADE
);
CREATE NONCLUSTERED INDEX [IX_Post_BlogId_Test]
ON [dbo].[Post]([Post_BlogId] ASC);
您可以看到生成數據庫對象名稱遵循的命名約定。
轉載請注明出處,原文鏈接:http://www.cnblogs.com/tdfblog/p/entity-framework-core-naming-convention.html。