EF код сначала InsertOrUpdate с возвратом T - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время у меня есть код, который вставляет или обновляет и возвращает затронутую сущность, но сейчас он возвращает определенный тип

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;
    }

возможно ли сделать этот возвращаемый динамический тип? (Также хочу спросить ... это плохая практика?)

1 Ответ

0 голосов
/ 17 октября 2018

На основании вашего комментария:

Да, я могу это сделать .. но моя проблема в 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
                );

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...