Код EF сначала InsertOrUpdate с возвратом T

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

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

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

Я бы по возможности воздерживался от динамических. Почему бы не сделать метод универсальным? TEntity InsertOrUpdate<TEntity>

marsze 17.10.2018 09:19

Да, я могу это сделать ... но моя проблема - context.tbl_purchases_record.SingleOrDefault (lambda) ... я пробую context.Set (typeof (TEntity)), но у него нет SingleOrDefault

Arianne 17.10.2018 09:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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 17.10.2018 11:03

Я также хочу выполнить что-то, прежде чем оно будет вставлять или обновлять

Arianne 17.10.2018 11:05

@Arianne: AddOrUpdate не возвращает объект, поэтому я добавлю это предостережение к своему ответу.

Flater 17.10.2018 11:08

@Arianne: Я пропустил BeforeTransaction, потому что (1) он не является частью фактического вопроса / ответа и (2) у меня недостаточно информации, чтобы понять это. Конечно, вы можете добавить это обратно при реализации кода в своей кодовой базе.

Flater 17.10.2018 11:10

Мне очень жаль BeforeTransaction. но ваш ответ действительно помогает мне спасибо :) ..

Arianne 17.10.2018 11:16

Другие вопросы по теме