11

.netで本当に迷惑な命名規則を使用する既存のデータベースを使用する必要がある新しいアプリケーションを開始しています(テーブル名はテーブルのビジネスドメインを指定するいくつかのトリグラムで始まり、列名はテーブルのトリグラムで始まります、トリグラム大文字で、アンダースコアなどで区切られています)。

私がやりたいのは、単純な名前変更ルールを作成し(これは、最後のアンダースコアを見つけてその後すべてを取得するのと同じくらい簡単です)、それをEntityFrameworkに適用することです。特にデータベースが変更される可能性があり、何度も編集したくないので、エディターで名前を1つずつ編集する必要はありません。

私はデータベースファースト(データベースがすでに存在し、それが「マスター」であるため)とEF 4.x DbContext Generatorを使用しており、箱から出してすぐに非常にうまく機能します(ただし、クラスとプロパティの名前が間違っています)。

生成されたエンティティとプロパティの名前を変更するためにT4テンプレートを編集しましたが、リクエストを実行しようとすると、DbContextオブジェクトは、リクエストしようとしているエンティティと一致するテーブルを見つけることができず、次の例外が発生します。

エンティティタイプ[エンティティ名]は、現在のコンテキストのモデルの一部ではありません。

これは、テーブルが見つからない理由は明らかです。オンザフライで変更したときに、エンティティ名とテーブルを一致させる方法は何もわかりません。メソッドに命令を追加できることを読みましたOnModelCreating(DbModelBuilder modelBuilder)が、これはDatabase Firstでは使用されません(念のため、デフォルトのT4テンプレートで例外が追加されます)。

だから今私は立ち往生しています、私はその一致を指定する方法がわかりません。

これが私が持っているいくつかのアイデアですが、それが正しいか実行可能かどうかはわかりません:

  • 「複数/単数」APIを使用してエンティティの名前を変更しますか?汚い回避策のように聞こえます。しかし、それはうまくいくかもしれません(しかし試みませんでした)。
  • その場でEDMXファイルを編集する方法を見つける。
  • 後でEDMXを編集しますが、プロセスが複雑になる可能性があります(デザイナーで編集し、ツールを実行してEDMXを変更し、カスタムツールを実行してエンティティとDbContextを再生成します...今日はデザイナーで編集する必要があります)。
  • コードファーストを使用する(DbContextクラスの属性または命令を使用して、テーブル名とは異なるエンティティ名を使用する方が簡単なようです)が、既存のデータベースで使用する方が複雑ではないようです。

何か案が ?それとも私は何かを逃しましたか?

4

1 に答える 1

8

実際の.edmxファイルの内容を変更して、ストアエンティティ名(不快なプレフィックスを含む)をサニタイズされた概念エンティティ名にマップするため、これにT4変換を使用することはできません。

代わりに、.edmxファイルを入力として受け取り、概念モデルタグの下の名前をサニタイズし、サニタイズされた名前を反映するようにマッピング名を変更するアプリケーションを作成することをお勧めします。これが3番目の選択肢であり、可能であればこれを避けたいと思ったことは理解していますが、これが最も簡単な方法です。このツールを実行する必要があるのは、新しいテーブルまたは列を追加するときだけであることに注意してください。

于 2012-08-29T16:39:00.237 に答える