1

現在の最新のEFバージョンでは、エンティティに一意の制約を追加する方法がないため、私はアイデアを思いつきました。(SQLを埋め込むことで制約を追加できることはわかっています)

リポジトリクラスにメソッドを追加しました:

private IDbSet<T> Entities;

public virtual bool Contains(Func<T, bool> predicate)
{
        return Entities.Any(t => predicate(t));
}

これにより、現在の重複防止ロジックが置き換えられると思います。

bool already exists = (from t in someSet.Entities 
                       where t.UniqueColumn == entity.UniqueColumn select t).
                       FirstOrDefault() != null;

if(alreadyExists)
throw new Exception("Entity already exists in DB.");

これは良い考えですか、データベースへの重複した挿入/更新を防ぐための最良の方法は何ですか?

編集:述語を使用するようにContainsメソッドを編集しました。これで、次のようなコードを記述できます。

if(repository.Contains(t=> t.Email == "someemail@email.com")
     throw new Exception("Email already exists.");
4

3 に答える 3

3

これがまれな状況になる場合は、データベースに一意の制約を設定し、既存のレコードを挿入しようとしたときに生成される例外をキャッチしても問題はありません。

これが頻繁に発生する可能性がある場合でも、データベースに制約を課しますが、そのままチェックを行います。

FWIW、Expression<Func<T, bool>>クエリがEnumerableに変換されないように、メソッドにを取得させる必要があります。

于 2012-05-05T18:05:51.837 に答える
2

一意性を強制したいものを宣言する必要があるため、これは機能しません。主キーで?「UserName」のような他の列で?User.EMail 列では、それが null でない場合のみ (そのため、複数のユーザーが同時に null の EMail を持つことができます)?

私はそのようなことを明示することを好みます。だから私は実際にあなたが以前に持っていたロジックを好む.

于 2012-05-05T16:05:06.087 に答える
0

DB で一意性を確保する最善の方法は、一意の制約を使用することです。

于 2012-05-05T16:11:18.663 に答える