您的位置:首页 > 其它

Entity Framework Core 命名约定

2017-07-28 07:35 316 查看
注意:我使用的是 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);

您可以看到生成数据库对象名称遵循的命名约定。

相关文章: 
Entity Framework Core 生成跟踪列

在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

Entity Framework Core的贴心:优雅处理带默认值的数据库字段

Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

Entity Framework Core 软删除与查询过滤器

原文地址:http://www.cnblogs.com/tdfblog/p/entity-framework-core-naming-convention.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: