2016-05-27 8 views

答えて

46

EF RC2ビルドの場合、このための慣例はありません。これはEFコアチームからのものです:

EFコアの以前のプレリリースでは、エンティティのテーブル名は、エンティティクラス名と同じ でした。 RC2では、DbSet プロパティの名前を使用します。指定されたエンティティタイプにDbSetプロパティが定義されていない場合は、 エンティティクラス名が使用されます。


1. DbSet特性のための特異名を選択する:あなたが戻ってテーブルのためのRC1命名規則に戻したい場合は


は今、あなたが行くには3つの方法があります

1つの方法は、私が好きではないDbSetのプロパティ名を特異化することです。 ToTableを使用して

public DbSet<Book> Book { get; set; } 


2.()流暢API:

あなたはもちろんできますが、ブック実体を持っていて、ブックテーブルにマッピングするたとえば言います流暢なAPIを使用して任意の規約をオーバーライドし、必要に応じてテーブル名を指定します。

modelBuilder.Entity<Book>().ToTable("Book"); 


3.カスタム条約を書く:EFコア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(); 
     } 
    } 
} 

をそして、我々は単に私たちのDbContextオブジェクトにOnModelCreating方法からそれを呼び出す:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.RemovePluralizingTableNameConvention(); 
} 


締め切り:

私は好きではありません複数の表の名前と私は最後のオプションが他のものよりも好きで、それに行きました。それは私の個人的な意見であり、他の開発者は他のものよりも有利な3つの方法のいずれかを見つけて、それを選択するかもしれません:)

+1

はあなたにモルテザをありがとうございます。私は今のところ、エンティティにテーブル名を設定するだけだと思います。 –

+0

問題ありません。確かに、それも動作します:) –

+0

私は私の答えにあなたの方法を追加して、他の同僚の開発者の参考になるようにそれらを1か所にまとめました。ありがとう。 –

4

EFコアバージョンはentity.DisplayNameをサポートしていないようです。あなたがを複数形やフックでDbSetsCollectionsをsingularize に選択することができEntity FrameworkのNETコアV2で

foreach (var entityType in modelBuilder.Model.GetEntityTypes()) 
{ 
    // Skip shadow types 
    if (entityType.ClrType == null) 
     continue; 

    entityType.Relational().TableName = entityType.ClrType.Name; 
} 
2

:これは働いて代わるものです。

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/869033

関連する問題