Мне нравится тот факт, что AddOrUpdate позволяет указать фильтр для проверки, чтобы не добавлять дубликаты. Но я бы хотел получить аналогичную функциональность без обновления.
Сейчас я делаю что-то вроде этого:
var checkProfile = from p in db.Profile
where p => p.LastName == newProfile.lastName
&& p => p.FirstName == newProfile.firstName
&& p => p.Middle== newProfile.middle
select p;
if (checkProfile.FirstOrDefault() == null)
{
db.Profile.Add(newProfile);
db.SaveChanges();
}
Я знаю, что могу сделать что-то вроде этого:
db.Profile.AddOrUpdate(p => new {p.LastName, p.FirstName, p.Middle}, newProfile);
db.SaveChanges();
Но я предпочел бы пропустить модификацию данных в этом случае.
Первый пример делает то, что я хочу, но с большим количеством кода. Есть ли более простой/чистый способ сделать то, что я хочу в первом примере?
Update:
Мне нравится предложение Огняна Димитрова. Я пытаюсь его реализовать. Мои модели наследуют от BaseEntity. Могу ли я разместить там общую версию?
Моя модель определена:
public class Address :BaseEntity
{
My BaseEntity:
public class BaseEntity
{
public virtual T AddIfNotExists<T>(T entity, Expression<Func<T, bool>> predicate = null)
{
var exists = predicate != null ? DbSet.Any(predicate) : DbSet.Any();
return !exists ? DbSet.Add(entity) : null;
}
}
Я получаю ошибки для Any (...) и Add (...). Ошибка для Add (...) - "Ссылка на объект требуется для нестатического поля, метода или свойства" System.Data.Entity.DbSet.Add(object) ''
Должен ли я использовать this.Add(объект)?
Обновление 2:
Я создал этот код:
public static class DbSetExtensions
{
public static T AddIfNotExists<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, bool>> predicate = null) where T : class, new()
{
var exists = predicate != null ? dbSet.Any(predicate) : dbSet.Any();
return !exists ? dbSet.Add(entity) : null;
}
}
Теперь я пытаюсь назвать это так, но это не правильно. Простите мое отсутствие понимания.
_db.ProfileIdentifier.AddIfNotExists(newIdentifier,
pi => new {pi.ProfileId, pi.ProfileIdentifierTypeId, pi.ProfileIdentifierValue});
Обновление - Решение:
Я могу назвать DbSetextensions следующим образом:
_db.ProfileIdentifier.AddIfNotExists(newIdentifier,
pi => pi.ProfileId == profileId &&
pi.ProfileIdentifierTypeId == (int)type &&
pi.ProfileIdentifierValue == value);
Большое спасибо за работу со мной Огняном!!!