2012-05-05 3 views
1

Поскольку нет никакого способа добавить уникальное ограничение для сущностей в последней версии EF, я придумал идею. (Я знаю, что ограничения могут быть добавлены путем внедрения SQL)Уникальный Constraint Hack - Entity Framework

Я добавил метод в мой Repository класса:

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."); 

Is это хорошая идея, что является лучшим способом предотвратить дублирование вставки/обновления в базу данных?

EDIT: Я редактировал метод Содержит для использования предиката. Теперь я могу написать такой код:

if(repository.Contains(t=> t.Email == "[email protected]") 
    throw new Exception("Email already exists."); 

ответ

3

Если это будет редкая ситуация, тогда нет ничего плохого в том, чтобы помещать уникальное ограничение в базу данных, а затем ловить исключение, которое генерируется при попытке вставить существующую запись.

Если это, вероятно, произойдет много, тогда я все равно положу ограничение на базу данных, но сделаю проверку как есть.

FWIW, вы должны сделать свой метод занять Expression<Func<T, bool>>, чтобы запрос не преобразовывался в Enumerable.

2

Ну, это не будет работать, потому что вы должны объявить, что вы хотите, чтобы обеспечить уникальность на. На первичном ключе? В каком-то другом столбце, например «UserName»? В столбце User.EMail, но только если он не является нулевым (так что вы можете одновременно иметь несколько пользователей с нулевым EMail)?

Я предпочитаю, чтобы такие вещи были явными. Поэтому я предпочел бы логику, которую вы имели раньше.

+0

Можете ли вы проверить мое редактирование на Содержит метод, пожалуйста? Думаю, теперь это сработает. –

0

Наилучшим способом обеспечения единства в БД является использование уникального ограничения.

Смежные вопросы