質問

Entity Framework 4.3.1 Code-Firstを使用しており、エンティティを2つのテーブルに分割する必要があります。テーブルには主キーが共有されており、1対1ですが、各テーブルで列の名前が同じではありません。

データのレイアウトを管理したり、変更をリクエストしたりすることはできません。

たとえば、SQLテーブルは次のようになります

SQLデータテーブル

そしてこれが私の実体になります... ジェネラコディセタグプレ

そしてこれが私が持っているマッピングです。 ジェネラコディセタグプレ

それらの間で共有されるキーの列名が異なるため、マップする方法がわかりません。このマッピングはコンパイルされますが、EFがSQLを発行して、存在しない「ExtendedTable」テーブルの「ThePrimaryKeyId」列を探しているため、実行時に失敗します。

編集 明確にするために、「ExtendedTable」のPKが命名規則に従っている場合、上記で定義したことは機能します(そして機能します)。しかし、そうではなく、スキーマを変更することはできません。

基本的に、EFが発行する必要があるのは次のようなSQLステートメントです ジェネラコディセタグプレ

しかし、放出したいと思われるのは ジェネラコディセタグプレ

編集 NSGagaの提案で、もう一度1対1のアプローチを試しました。動作しませんでしたが、結果は次のとおりです。 エンティティ ジェネラコディセタグプレ

これがマッピングクラスです ジェネラコディセタグプレ

この設定はメッセージを受け取ります ジェネラコディセタグプレ

最終的なマップラインの変更 ジェネラコディセタグプレ

このメッセージを返します ジェネラコディセタグプレ

親テーブルの列MapKey("ThePrimaryKeyId")を使用するようにマップされたキーを変更します。このメッセージを返します ジェネラコディセタグプレ

IdプロパティをExtEntityクラスから削除すると、エンティティに定義されたキーがないため、エラーがスローされます。

役に立ちましたか?

解決

列の名前が両方のテーブルで同じでなければならないことを具体的に述べているものは何も見つかりません。しかし、そうではないと言ったり、そのシナリオをどのようにマッピングするかを説明したりするものも見つかりません。私が見つけることができるすべての例には、両方のテーブルに同じ名前のキーがあります。これはDbContextデザインの穴のように見えます。

他のヒント

私はこの問題に数日間取り組んできましたが、最終的に行ったのは、マッピングフラグメントのコンテキスト内でにIdフィールドの列名を設定することでした。このようにして、ID(またはIDに依存する外部キー)にメインテーブルのIDとは異なる名前を付けることができます。 ジェネラコディセタグプレ

これを実行してデバッグすると、必要なものが得られることがわかります。 ジェネラコディセタグプレ

HasColumnNameをマッピング内に移動します: ジェネラコディセタグプレ

ここにはVisualStudioはありませんが、1対1のアプローチでこれを試してください:

this.HasRequired(e=> e.ExtendedProperties).HasConstraint((e、m)=> e.Id== m.Id);

更新:
ここに役立つかもしれないいくつかのリンクがあります(実際の参照リンクを見つけることができませんでした)

方法Entity Framework 4 Code First(POCO)を使用して1対1の関係を宣言する
エンティティフレームワーク4CTP4コードファースト:型にはまらない主キーと外部キーの名前を操作する方法

そして(私が約束したように)1対1(2つのエンティティ、2つのテーブル)のマッピングを提供するだけです。
これが私にとってうまくいくものであり、あなたの場合にすべきことです... ジェネラコディセタグプレ

...そして次のようなテストコード... ジェネラコディセタグプレ

これにより、次のSQLスクリプト、テーブルが作成されます... ジェネラコディセタグプレ

そして、上記の議論のとおり、メモ...
これは「分割」ではありませんが、
(a)最初のコードIMOはそのようなことを許可しません(私は最初にそれを試し、手動で移行を変更しましたが、それはすべて「内部的に」予想される列名が同じであることに基づいており、それを回避する方法はないようです。少なくともこのバージョンのEF。
(b)テーブル構造の観点から-テーブルは、(変更できなかった)既存のaspnetメンバーシップテーブルを独自のユーザーを持つユーザーテーブルに関連付けるために使用する前に言ったように、必要なものを正確に表示するように作成できます-idはoutside / aspnetテーブルとidを指します。
確かに、1つのC#モデルクラスを使用して作成することはできませんが、C#側の方がはるかに柔軟性があり、少なくとも私の意見では、同じ効果をもたらすはずのC#を制御できれば(テストのように、いつでもアクセスできます)拡張エンティティを介して、拡張列とメイン列の両方があり、それらは常に1対1で一致し、「同期」を維持します。
これがいくつかの助けになることを願っています
注:fk idなどについて心配する必要はありません。常にMainEntryを介してメインエントリにアクセスして追加するだけで、id-sで問題ありません。

編集:
次のことを実行して、1つのクラスだけを処理する必要があるように見せることもできます(つまり、一種の分割) ジェネラコディセタグプレ

...そしてこのように使用します... ジェネラコディセタグプレ

...また、依存の代わりにWithRequiredPrincipalを実行することで、fkの方向を元に戻すことができます。
(1対1が必要な場合は、すべての参照を「仮想」なしにする必要があります)
(そしてMainTableはここにあるように「内部」にすることができるので、外部からは見えません-EFが許可していないのでネストすることはできません-NotMappedのように扱われます)
...まあ、それが私にできる最善のことです:)

Entity Framework6で修正されたようです。この問題を参照してください http://entityframework.codeplex.com/ workitem / 388

次のようなデータ注釈を使用することをお勧めします: ジェネラコディセタグプレ

この問題に直面し、両方の列名に一致するように列属性を追加することで解決しました。 [Key] [Column("Id")] public int GroupId { get; set; }

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top