2011-07-20 9 views
6

私は既存のデータベースに対してEFコードファースト開発を行っています。私はスキーマが渡され、テーブル名のいくつかは理想的ではないので、OnModelCreatingでマッピングを実行すると、特定のエンティティクラスの名前を基になるテーブルと異なるようにしたいと思います。エンティティをテーブルにマップできません。別のエンティティがテーブルと同じ名前を持っている場合

エンティティクラス名が既存のテーブル名と競合する場合、コードで再マップしても、これは機能していないようです。私はOnModelCreatingで、次のマッピングを実行しようとしています

  • ウィジェット
  • ガジェット

modelBuilder.Entity<Gadget>.ToTable("Sprocket"); 
modelBuilder.Entity<Widget>.ToTable("Gadget"); 

は、これらの(この例で構成された)エンティティクラスを考えます

実行時に、次のエラーが発生します。

System.InvalidOperationException : The entity types 'Widget' and 'Gadget' cannot share table 'Gadget' because they are not in the same type hierarchy or do not have a valid one to one foreign key relationship with matching primary keys between them.

私はガジェットテーブルからガジェットエンティティをマッピングしているので意味がありませんが、明示的に指定していても自動的にマッピングが行われているようです。

この動作の説明は何ですか?回避できますか?

答えて

2

あなたのエンティティとテーブル名は一意ですか? CF慣例によってその複数形のテーブルにエンティティをマッピングします

私が尋ねる理由は、あなたが

modelBuilder.Entity<Gadget>.ToTable("Sprockets") 
modelBuilder.Entity<Widget>.ToTable("Gadgets") 

ような何かをしようとしていた場合はEFはので、それは動作しないかもしれないということです。この規約を削除する場合は、PluralizingTableNameConventionを削除するだけです。

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
+0

おかげ上に固定されていますが、私はすでに場所でコードの行を持っていました。気まぐれに、私はそれを取り除こうとしましたが、結果は同じでした。 –

+0

エンティティ名を制御できる場合は、テーブル名に名前を付けないでください。 – OpticalDelusion

+2

あなたは良い点を挙げます。私はそれをすることができましたが、今のところ、なぜそれがうまくいかないかを知りたいと思っています。 –

0

テーブルが異なるスキーマに同じ名前を持っているとき、それはケースのように見えます。現在の日付まで、この側面ではEFのサポートはありません。例えば:

dict.Gadget 
cnfg.Gadget 

https://entityframework.codeplex.com/workitem/1641をチェックして、この修正プログラムの重要性を高めるために投票してください。

1

はFYI:1641は、上記のEF作業項目は、提案のためのversion 6.1.2

関連する問題