現在の最新の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.");