1

私はEF5コードを使用しています。最初に、クラスにXXXEntity基づいた名前のエンティティがあります。クラスにはプロパティがあります。EntityEntityId

ここに問題があります。通常、EFはXXXEntitiesという名前で、Idフィールドを持つ各エンティティのテーブルを作成します。私が欲しいのは、テーブルにXXX(エンティティなしで)名前を付け、IDを。にする必要があることXXXIdです。慣例を使用して一度にそれを行う方法。テーブル名とID名を1つずつ上書きできることはわかっています。しかし、それは少し退屈で再利用できません。EF5の慣習などを使用してそれを行うためのより良い方法はありますか?

アップデート

カスタムコードの最初の規則について読みましたが、これが古いページなのか、実装されていない機能なのかわかりません。Properties<T>()EF5でメソッドが見つからなかったため

4

2 に答える 2

2

いいえ、EF 5ではそれを行うことはできません。あなたのリンクは、EF6の将来の機能です。こちらをご覧ください

しかし、リフレクションを使用すると簡単にそれを行うことができます。再利用性のために、の拡張メソッドとしてそれを作成できDbModelBuilderます。少し遅くなりますが、ケースは解決します。ここであなたができること:

public static class MyCustomNamingConvention
{
    public static void ToMyDatabaseNamingConvention(
        this DbModelBuilder mb, IEnumerable<Type> entities)
    {
        foreach (var entity in entities)
        {
            var mi = typeof(MyCustomNamingConvention)
                .GetMethod("MyNamingConvention")
                .MakeGenericMethod(entity);
            mi.Invoke(null, new object[] { mb });
        }
    }

    public static void MyNamingConvention<T>
        (DbModelBuilder mb) where T : Entity
    {
        var tableName = typeof(T).Name.Replace("Entity", "");
        mb.Entity<T>().HasKey(x => x.Id);
        mb.Entity<T>().Property(x => x.Id).HasColumnName(tableName + "Id");
        mb.Entity<T>().ToTable(tableName);
    }

}

DBContextonOnModelCreatingメソッドで使用するだけです

protected override void OnModelCreating(DbModelBuilder mb)
{
    base.OnModelCreating(mb);
    mb.ToMyDatabaseNamingConvention(GetEntities());
}

ノート:

  • の適切な名前空間を追加することを忘れないでください MyCustomNamingConvention
  • GetEntities()エンティティを反復処理するメソッドです(Entity基本クラスをスキップすることを忘れないでください)
于 2012-12-13T01:23:40.673 に答える
1

これを使用して、テーブルの複数形を削除します。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

列ID名に対して無効にできる規則が見つからないようです。http://msdn.microsoft.com/en-us/library/gg696316(v=vs.103).aspxをご覧ください

于 2012-12-12T07:10:44.853 に答える