[解決済み] Entity Frameworkにおける一意性制約 Code First
2022-07-12 17:19:27
質問
質問
フルエント構文または属性のいずれかを使用して、プロパティに一意制約を定義することは可能ですか? そうでない場合、回避策はありますか?
主キーを持つユーザークラスがありますが、電子メールアドレスも一意であることを確認したいと思います。これは、データベースを直接編集することなく可能ですか?
解決策 (マットの回答に基づいて)
public class MyContext : DbContext {
public DbSet<User> Users { get; set; }
public override int SaveChanges() {
foreach (var item in ChangeTracker.Entries<IModel>())
item.Entity.Modified = DateTime.Now;
return base.SaveChanges();
}
public class Initializer : IDatabaseInitializer<MyContext> {
public void InitializeDatabase(MyContext context) {
if (context.Database.Exists() && !context.Database.CompatibleWithModel(false))
context.Database.Delete();
if (!context.Database.Exists()) {
context.Database.Create();
context.Database.ExecuteSqlCommand("alter table Users add constraint UniqueUserEmail unique (Email)");
}
}
}
}
どのように解決するのですか?
私が知る限り、Entity Frameworkでこれを行う方法は今のところありません。 しかし、これはユニーク制約だけの問題ではありません。インデックスやチェック制約、場合によってはトリガーや他のコンストラクトも作成したいかもしれません。 以下は、使用できる簡単なパターンです。 しかし、これはデータベースに依存しません。
public class MyRepository : DbContext {
public DbSet<Whatever> Whatevers { get; set; }
public class Initializer : IDatabaseInitializer<MyRepository> {
public void InitializeDatabase(MyRepository context) {
if (!context.Database.Exists() || !context.Database.ModelMatchesDatabase()) {
context.Database.DeleteIfExists();
context.Database.Create();
context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT...");
context.ObjectContext.ExecuteStoreCommand("CREATE INDEX...");
context.ObjectContext.ExecuteStoreCommand("ETC...");
}
}
}
}
別の選択肢は、ドメインモデルがデータベースでデータを挿入/更新する唯一の方法である場合、一意性の要件を自分で実装して、データベースを除外することができます。 これはより移植性の高いソリューションであり、コードの中でビジネスルールについて明確にすることを強制しますが、無効なデータがバックドアされる可能性があるため、データベースをオープンにしておきます。
関連
-
[解決済み] 不変量名 'System.Data.SqlClient' を持つ ADO.NET プロバイダに対応する Entity Framework プロバイダが見つかりませんでした。
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み] Entity Frameworkで生成されたSQLを表示するにはどうすればよいですか?
-
[解決済み] エンティティ・フレームワーク・マイグレーションをリセットする
-
[解決済み】Entity Framework 4.1 Code Firstでクラスプロパティを無視する
-
[解決済み】Entity Framework コードファースト - 同じテーブルから2つの外部キー
-
[解決済み】Entity Framework Coreがユニーク制約をコードファーストで追加する
-
[解決済み] Entity Framework Code Firstでオブジェクトをデタッチするにはどうすればいいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Entity Framework - エラー 11007。エンティティタイプはマッピングされていません。
-
[解決済み] NULLも許容するユニークな制約を作成するにはどうしたらいいですか?
-
[解決済み] Entity Framework: "ストアの更新、挿入、または削除ステートメントが予期しない行数 (0) に影響しました。" [クローズド]。
-
[解決済み】DbContext.Database.ExecuteSqlCommandメソッドにパラメータを渡すにはどうしたらよいですか?
-
[解決済み] Entity Framework - やり直し - すべての移行を元に戻す/ロールバックする
-
[解決済み] キーワードはサポートされていません。"データソース" Entity Framework Contextの初期化
-
[解決済み] EF Code First "Invalid column name 'Discriminator'" but no inheritance.
-
[解決済み] Symfony2で現在のユーザを表すエンティティを取得する方法は?
-
[解決済み] 特定のVSプロジェクトでのみパッケージマネージャーコンソールのマイグレーションを有効にするCommandNotFoundExceptionを発生させる
-
[解決済み] Entity Framework Code First - Fluent ApiとData Annotationsのメリット・デメリット【終了しました