[解決済み] Entity Framework Fluent APIを用いた1対1のオプション関係
質問
Entity Framework Code Firstを使用して、1対1の任意の関係を使用したいと思います。2つのエンティティがあります。
public class PIIUser
{
public int Id { get; set; }
public int? LoyaltyUserDetailId { get; set; }
public LoyaltyUserDetail LoyaltyUserDetail { get; set; }
}
public class LoyaltyUserDetail
{
public int Id { get; set; }
public double? AvailablePoints { get; set; }
public int PIIUserId { get; set; }
public PIIUser PIIUser { get; set; }
}
PIIUser
を持つことがあります。
LoyaltyUserDetail
がありますが
LoyaltyUserDetail
には、必ず
PIIUser
.
これらの流動的なアプローチ手法を試してみました。
modelBuilder.Entity<PIIUser>()
.HasOptional(t => t.LoyaltyUserDetail)
.WithOptionalPrincipal(t => t.PIIUser)
.WillCascadeOnDelete(true);
この方法では
LoyaltyUserDetailId
に外部キーを作成しません。
PIIUsers
テーブルの外部キーです。
その後、以下のコードを試してみました。
modelBuilder.Entity<LoyaltyUserDetail>()
.HasRequired(t => t.PIIUser)
.WithRequiredDependent(t => t.LoyaltyUserDetail);
しかし、今回EFはこれら2つのテーブルに外部キーを作成しませんでした。
この問題に対して何かアイデアはありますか? どのようにエンティティフレームワークフルエントAPIを使用して1対1の任意の関係を作成することができますか?
どのように解決するのですか?
EF コードファーストのサポート
1:1
と
1:0..1
の関係があります。後者はあなたが探しているものです ("1対0または1")。
あなたの流暢な試みは次のように言っています。 両端が必要 であり は両端が任意 である。
必要なものは 任意 を片方に、そして が必要です。 があります。
Programming E.F. Code Firstの本からの例です。
modelBuilder.Entity<PersonPhoto>()
.HasRequired(p => p.PhotoOf)
.WithOptional(p => p.Photo);
は
PersonPhoto
エンティティには、ナビゲーションプロパティとして
PhotoOf
を指す
Person
型になります。 は
Person
タイプには、ナビゲーションプロパティとして
Photo
を指す
PersonPhoto
型を指す。
関連する2つのクラスで、それぞれの型の
主キー
ではなく
外部キー
を使うことはありません。
LoyaltyUserDetailId
または
PIIUserId
プロパティを使用します。その代わり、関係は
Id
フィールドに依存します。
上記のようにfluent APIを使用している場合、"co "フィールドに
LoyaltyUser.Id
を外部キーとして指定する必要はなく、EFがそれを判断します。
だから、自分自身をテストするためにあなたのコードを持っていない(私は頭からこれを行うのは嫌だ)... 私はこれをあなたのコードに次のように変換します。
public class PIIUser
{
public int Id { get; set; }
public LoyaltyUserDetail LoyaltyUserDetail { get; set; }
}
public class LoyaltyUserDetail
{
public int Id { get; set; }
public double? AvailablePoints { get; set; }
public PIIUser PIIUser { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<LoyaltyUserDetail>()
.HasRequired(lu => lu.PIIUser )
.WithOptional(pi => pi.LoyaltyUserDetail );
}
LoyaltyUserDetailsと書いてありますね。
PIIUser
プロパティは
必須
で、PIIUserの
LoyaltyUserDetail
プロパティは任意です。
反対側から始めてもいいのでは?
modelBuilder.Entity<PIIUser>()
.HasOptional(pi => pi.LoyaltyUserDetail)
.WithRequired(lu => lu.PIIUser);
となっていますが、これは PIIUser の
LoyaltyUserDetail
プロパティはオプションで、LoyaltyUserの
PIIUser
プロパティは必須です。
常にHAS/WITHのパターンを使用する必要があります。
HTHと参考までに、1対1(または1対0/1)の関係は、最初にコードで構成する際に最も混乱する関係の1つなので、あなただけではありません! :)
関連
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] エンティティフレームワークのタイムアウト
-
[解決済み] Entity Framework 5 レコードを更新する
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み】1つ以上の外部キーのプロパティが非NULLであるため、リレーションシップを変更できませんでした。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】URLから画像をダウンロードする方法