#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();
}