На основании вашего комментария:
Да, я могу это сделать .. но моя проблема в context.tbl_purchases_record.SingleOrDefault (lambda) ... я пытаюсь context.Set (typeof (TEntity))но у него нет SingleOrDefault
При использовании универсального метода правильный синтаксис:
context.Set<TEntity>().FirstOrDefault();
Вы просто передаете универсальный параметр.
Собираем все вместе:
public T InsertUpdate<T>(T obj, DB context, Func<T,bool> lambda)
{
var entity = context.Set<T>().SingleOrDefault(lambda);
if (entity == null)
{
entity = context.Set<T>().Add(obj);
}
else
{
context.Entry(entity).CurrentValues.SetValues(obj);
}
context.SaveChanges();
return entity;
}
Также обратите внимание, что в более новых версиях EF на самом деле существует AddOrUpdate
метод, который делает то же самое:
context.Set<T>().AddOrUpdate(
lambda, //How to identify a pre-existing item
obj //The item with new values
);
Это будет делатьтоже самое.Если он найдет ранее существующий элемент, он обновит его.В противном случае он создаст новый элемент. Однако, это не вернет созданный / обновленный элемент и, следовательно, это, вероятно, не то, что вы хотите использовать здесь.