[解決済み] EF コード ナビゲーションプロパティを使用しない最初の外部キー
質問
以下のようなエンティティがあるとします。
public class Parent
{
public int Id { get; set; }
}
public class Child
{
public int Id { get; set; }
public int ParentId { get; set; }
}
Parentsテーブルへの外部キー制約でParentIdがデータベース内に作成されることを強制するための、コード最初の流暢なAPI構文は何ですか。 ナビゲーションプロパティを持つ必要なく ?
ナビゲーションプロパティのParentからChildを追加すれば、できることは知っています。
modelBuilder.Entity<Child>()
.HasRequired<Parent>(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);
しかし、この特定のケースでは、ナビゲーション・プロパティは必要ありません。
どのように解決するのですか?
EF Code First Fluent APIでは、それは不可能です。データベースで外部キー制約を作成するために、常に少なくとも1つのナビゲーションプロパティが必要です。
Code First Migrations を使用している場合、パッケージマネージャーコンソールで新しいコードベースのマイグレーションを追加するオプションがあります (
add-migration SomeNewSchemaName
). モデルやマッピングに何か変更があった場合は、新しいマイグレーションが追加されます。何も変更していない場合、新しいマイグレーションを強制するために
add-migration -IgnoreChanges SomeNewSchemaName
. マイグレーションには空の
Up
と
Down
というメソッドがあります。
次に
Up
メソッドに次のようなものを追加します。
public override void Up()
{
// other stuff...
AddForeignKey("ChildTableName", "ParentId", "ParentTableName", "Id",
cascadeDelete: true); // or false
CreateIndex("ChildTableName", "ParentId"); // if you want an index
}
このマイグレーションを実行する (
update-database
を実行すると、次のような SQL 文が実行されます (SQL Server の場合)。
ALTER TABLE [ChildTableName] ADD CONSTRAINT [FK_SomeName]
FOREIGN KEY ([ParentId]) REFERENCES [ParentTableName] ([Id])
CREATE INDEX [IX_SomeName] ON [ChildTableName] ([ParentId])
あるいは、マイグレーションを使わずに、純粋な SQL コマンドとして
context.Database.ExecuteSqlCommand(sql);
ここで
context
は派生したコンテキストクラスのインスタンスであり
sql
は上記のSQLコマンドを文字列で表したものです。
このように、EFには
ParentId
が関係を記述する外部キーであることをEFは全く理解しません。EFはこれを通常のスカラプロパティとしてのみ扱います。どういうわけか、上記のすべては、SQL 管理ツールを開いて制約を手作業で追加することに比べて、より複雑で低速な方法に過ぎないのです。
関連
-
[解決済み] EFのマイグレーション。最後に適用したマイグレーションをロールバックしますか?
-
[解決済み] FOREIGN KEY制約を導入すると、サイクルや複数のカスケード・パスが発生する可能性があります - なぜですか?
-
[解決済み] Entity Framework: "ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響しました。" [クローズド]。
-
[解決済み】DbContext.Database.ExecuteSqlCommandメソッドにパラメータを渡すにはどうしたらよいですか?
-
[解決済み】1つ以上の外部キーのプロパティが非NULLであるため、リレーションシップを変更できませんでした。
-
[解決済み] Entity Frameworkのバージョンは?
-
[解決済み] 特定のVSプロジェクトでのみパッケージマネージャーコンソールのマイグレーションを有効にするCommandNotFoundExceptionを発生させる
-
[解決済み] Entity Frameworkにおける一意性制約 Code First
-
[解決済み] Entity Frameworkの接続文字列はどのように編集すればよいですか?
-
[解決済み] EF Core の EntityTypeBuilder に ToTable の定義が含まれていない。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 不変量名 'System.Data.SqlClient' を持つ ADO.NET プロバイダに対応する Entity Framework プロバイダが見つかりませんでした。
-
[解決済み] Entity Framework - エラー 11007。エンティティタイプはマッピングされていません。
-
[解決済み] Entity Frameworkで生成されたSQLを表示するにはどうすればよいですか?
-
[解決済み] Entity Framework - やり直し - すべての移行を元に戻す/ロールバックする
-
[解決済み] Symfony2で現在のユーザを表すエンティティを取得する方法は?
-
[解決済み] Entity Frameworkのバージョンは?
-
[解決済み] 特定のVSプロジェクトでのみパッケージマネージャーコンソールのマイグレーションを有効にするCommandNotFoundExceptionを発生させる
-
[解決済み] Entity Framework コード 一意の列
-
[解決済み] EF Core の EntityTypeBuilder に ToTable の定義が含まれていない。
-
[解決済み] Entityフレームワークのバルクインサートのパフォーマンス向上【重複あり