このコードがEFコアRC 2で行ったことを実行する方法はありますか?エンティティフレームワークコアRC2テーブル名複数化
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
このコードがEFコアRC 2で行ったことを実行する方法はありますか?エンティティフレームワークコアRC2テーブル名複数化
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
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つの方法のいずれかを見つけて、それを選択するかもしれません:)
EFコアバージョンはentity.DisplayName
をサポートしていないようです。あなたがを複数形やフックでDbSets
とCollections
を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;
}
:これは働いて代わるものです。
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
はあなたにモルテザをありがとうございます。私は今のところ、エンティティにテーブル名を設定するだけだと思います。 –
問題ありません。確かに、それも動作します:) –
私は私の答えにあなたの方法を追加して、他の同僚の開発者の参考になるようにそれらを1か所にまとめました。ありがとう。 –