EF Coreを利用してCodeFirstでMigrationによりデータベースのテーブルを作成するときですが、テーブル名と列名がC#のプロパティ名となるため、デフォルトではUpperCamelCaseになります。
これを変更するにはテーブル名であれば{Table("table_name")
、列名であれば[Column("column_name")]
とそれぞれに設定することで対応可能です。
しかし、このようにアノテーションを設定することは結構面倒です。特にPostgreSQLを使用している場合には列名に大文字を使用するとハマりどころとなったりします。
お手軽に列名をLowerSnakeCaseに変換する
少し調べてみたところ、EF CoreのIssueに以下のようにContextクラスのOnModelCreating
で列名とテーブル名を変換する方法が紹介されていましたので試してみました。
namespace Some.Models { public class SomeContext:DbContext { public DbSet<... protected override void OnModelCreating(ModelBuilder modelBuilder) { ... base.OnModelCreating(modelBuilder); FixSnakeCaseNames(modelBuilder); } private static void FixSnakeCaseNames(ModelBuilder modelBuilder) { var mapper = new Npgsql.NpgsqlSnakeCaseNameTranslator(); foreach (var entity in modelBuilder.Model.GetEntityTypes()) { // modify column names foreach (var property in entity.GetProperties()) { property.Relational().ColumnName = mapper.TranslateMemberName(property.Relational().ColumnName); } // modify table name entity.Relational().TableName = mapper.TranslateMemberName(entity.Relational().TableName); // move asp_net tables into schema 'identity' if (entity.Relational().TableName.StartsWith("asp_net_")) { entity.Relational().TableName = entity.Relational().TableName.Replace("asp_net_", string.Empty); entity.Relational().Schema = "identity"; } } } } }
結果としてはこれで問題なくテーブル名と列名がLowerSnaleCaseになりましたので感謝感謝です。
参考
pluggable schemes for mapping c# names · Issue #5159 · aspnet/EntityFrameworkCore
このところPostgreSQLへC#から接続することを色々と試しているせいでしょうが、Shay Rojanskyさんには本当にお世話になっています。大抵の問題について回答されていてShay Rojanskyの回答からいろいろな人がいろいろな方法を紹介されている事が多いのでとても感謝しています。
- 作者: Gary McLean Hall,長沢智治,クイープ
- 出版社/メーカー: 日経BP社
- 発売日: 2015/06/04
- メディア: 単行本
- この商品を含むブログ (5件) を見る