В настоящее время у меня есть код, который вставляет или обновляет и возвращает затронутый объект но пока он возвращает определенный тип
public delegate void BeforeTransaction(tbl_purchases_record x);
public static tbl_purchases_record insertupdate(
tbl_purchases_record param,
DB context,
Func<tbl_purchases_record,bool> lambda,
BeforeTransaction beforetransaction = null)
{
var entity = context.tbl_purchases_record.SingleOrDefault(lambda);
beforetransaction?.Invoke(entity); // callable parameter
if (entity == null)
{
entity = context.tbl_purchases_record.Add(param);
}
else
{
context.Entry(entity).CurrentValues.SetValues(param);
}
context.SaveChanges();
return entity;
}
можно ли сделать этот возвращаемый динамический тип? (Также хочу спросить ... это плохая практика?)
Да, я могу это сделать ... но моя проблема - context.tbl_purchases_record.SingleOrDefault (lambda) ... я пробую context.Set (typeof (TEntity)), но у него нет SingleOrDefault





На основании вашего комментария:
Yes i can do that.. but my problem is context.tbl_purchases_record.SingleOrDefault(lambda)...i try context.Set(typeof(TEntity)) but this doesn't have 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
);
Это будет то же самое. Если он найдет уже существующий элемент, он обновит его. В противном случае будет создан новый элемент. Однако это не вернет созданный / обновленный элемент. и, следовательно, вероятно, не то, что вы хотите здесь использовать.
EF AddOrUpdate вернет затронутую строку?
Я также хочу выполнить что-то, прежде чем оно будет вставлять или обновлять
@Arianne: AddOrUpdate не возвращает объект, поэтому я добавлю это предостережение к своему ответу.
@Arianne: Я пропустил BeforeTransaction, потому что (1) он не является частью фактического вопроса / ответа и (2) у меня недостаточно информации, чтобы понять это. Конечно, вы можете добавить это обратно при реализации кода в своей кодовой базе.
Мне очень жаль BeforeTransaction. но ваш ответ действительно помогает мне спасибо :) ..
Я бы по возможности воздерживался от динамических. Почему бы не сделать метод универсальным?
TEntity InsertOrUpdate<TEntity>