Значение EF Core для DbContext для обновления или добавления

#entity-framework #entity-framework-core #dbcontext

Вопрос:

Используя ядро EF, у меня есть 10 методов, которые в основном делают то же самое. Обновите или добавьте, а затем сохраните изменения()

т.е.

   public void UpdateUser(User model)
    {
        if(... some condition.. to determine to add or update)
        {
            db.Update(model);
            db.Entry(model).State = EntityState.Modified;
        }
        else
        {        
           db.User.Add(model);
        } 
        db.SaveChanges(); 
    }

  public void UpdateCompany(Company model)
       {
        if(... some condition.. to determine to add or update)
        {
            db.Update(model);
            db.Entry(model).State = EntityState.Modified;
        }
        else
        {        
           db.Company.Add(model);
        } 
        db.SaveChanges(); 
    }
 

можно создать один метод и просто передать сущность, которую вы хотите обновить или добавить?

Ответ №1:

реальная разница между Update и Add — это PrimaryKey ценности. когда вы пытаетесь получить Update данные , которые содержат нуль PrimaryKey , он не будет обновлять данные, он добавит эти данные. вы можете контролировать model , чтобы узнать, обновляется он или нет . если PrimaryKey значение равно нулю, он может добавить эти данные. если значение PrimaryKey не равно нулю, могут Update ли данные :

     public void UpdateOrAdd(Company model)
    {
        if(model.CompanyID !=0) //The primary key
        {
            db.Update(model);
            db.Entry(model).State = EntityState.Modified;
        }
        else
        {        
           db.Company.Add(model);
        } 
        db.SaveChanges(); 
    }
 

EF создает PrimaryKey значение после db.SaveChanges(); метода.

я предлагаю вам попробовать поймать этот db.SaveChanges(); метод в последнюю очередь. вы можете получить сообщение об ошибке и показать его себе с помощью SweetAlert, вы можете дать правильное сообщение о том, что действие 0 успешно или нет.

Комментарии:

1. Я понимаю разницу между Обновлением и добавлением. Мой вопрос: у меня есть много методов, которые в основном делают то же самое.. обновите или добавьте сущность, например, таблицу пользователей, таблицу компаний.. Есть ли способ избежать создания множества одинаковых методов и просто иметь один и передать объект, который я хочу обновить/добавить ?

2. я никогда не пробовал этого, извини. я обыщу это

Ответ №2:

Вы можете использовать общий метод. Если вам нужен доступ к набору баз данных для сущности, используйте db.Set<TEntity>() вместо объявленных свойств набора баз данных db.Users или db.Comanies .

     public void Update<TEntity>(TEntity entity) where TEntity: class
    {

        if (1==1 /*whatever*/)
        {
            db.Update(entity);
        }
        else
        {
            db.Set<TEntity>().Add(entity);
        }
        db.SaveChanges();
    }