このコードがEF Core RC 2で行ったことを行う方法はありますか?
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
EF RC2ビルドの時点では、これに関する規約はありません。これはEF Coreチームからのものです。
過去のEF Coreのプレリリースでは、エンティティのテーブル名はエンティティクラス名と同じでした。 RC2では、DbSetプロパティの名前を使用するようになりました。指定されたエンティティタイプに対してDbSetプロパティが定義されていない場合、エンティティクラス名が使用されます。
テーブルのRC1命名規則に戻したい場合、次の3つの方法があります。
1。DbSetプロパティの特異名の選択:
1つの方法は、DbSetプロパティ名を特異化することです(これは好きではありません)。たとえば、Bookエンティティがあり、Bookテーブル:
public DbSet<Book> Book { get; set; }
2。ToTable()Fluent APIを使用:
もちろん、常に流れるようなAPIを使用して、所定の規則をオーバーライドし、テーブル名を任意に指定できます。
modelBuilder.Entity<Book>().ToTable("Book");
。カスタム規則の作成:
EF Core RC2にはこれに関する規約がないからといって、独自のコードを書くことができないわけではありません。そのためには、最初にModelBuilder
オブジェクトに拡張メソッドを作成する必要があります。
using Microsoft.EntityFrameworkCore.Metadata.Internal;
public static class ModelBuilderExtensions
{
public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
entity.Relational().TableName = entity.DisplayName();
}
}
}
そして、OnModelCreatingメソッドからDbContextオブジェクトで呼び出すだけです:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.RemovePluralizingTableNameConvention();
}
閉会時:
私は複数のテーブル名が好きではなく、最後のオプションが他のテーブル名よりも好きなので、それを使いました。それは私の個人的な意見であり、他の開発者はこれらの3つの方法のいずれかが他の方法よりも有利であると判断し、それを選択する可能性があります:)
EF Coreバージョンはentity.DisplayName
をサポートしていないようです。これは代替案です:
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
// Skip shadow types
if (entityType.ClrType == null)
continue;
entityType.Relational().TableName = entityType.ClrType.Name;
}
Entity Framework NETコアv2では、pluralizeを選択するか、DbSets
およびCollections
をフックで特異化できます。
public class MyDesignTimeServices : IDesignTimeServices
{
public void ConfigureDesignTimeServices(IServiceCollection services)
{
services.AddSingleton<IPluralizer, MyPluralizer>();
}
}
public class MyPluralizer : IPluralizer
{
public string Pluralize(string name)
{
return Inflector.Inflector.Pluralize(name) ?? name;
}
public string Singularize(string name)
{
return Inflector.Inflector.Singularize(name) ?? name;
}
}
詳細については、この回答を参照してください: https://stackoverflow.com/a/47410837/8690
EF Core 3.0の場合、これを使用してTableName
プロパティを設定します(entity.Relational()
がもう存在しないため):
public static class ModelBuilderExtensions
{
public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
entity.SetTableName(entity.DisplayName());
}
}
}
これもオプションです。
using System.ComponentModel.DataAnnotations.Schema;
[Table("Book")]
public class Book
{...}
ただし、各エンティティに注釈を付ける必要があります