Я написал метод InsertOrUpdate(), который использует мой контекст базы данных EntityFramework, и я хочу, чтобы этот метод мог получать объект, а затем либо вставлять новую строку, либо обновлять существующую, если она уже существует. Вставка работает нормально, но, к сожалению, EF не позволит мне сделать это для обновления. На самом деле он делает вид, что это сработало, но потом, прочитав строку, я вижу, что ничего не изменилось.
public async Task InsertOrUpdateUserByExternalId(UserModel user, CancellationToken cancellationToken = default)
{
if(user.User_ExternalID is null)
return false;
var userInDb = (await _db.Users
.AsNoTracking()
.FirstOrDefaultAsync(
u => u.User_ExternalID == user.User_ExternalID,
cancellationToken))
.Adapt();
if (userInDb is not null)
{
user.User_ExternalID = null; // Without this I get a "duplicate index" error
userInDb = user;
_db.Users.Update(userInDb.Adapt());
}
else
{
await _db.Users.AddAsync(user.Adapt(), cancellationToken);
}
var changes = _db.SaveChanges(); // This returns 1 which seems like it was successful
return changes == 1;
}
В этой версии я не конвертирую строку из базы данных в модель, а вместо этого работаю с сущностью и преобразую пользователя из параметра в сущность. К сожалению, я получаю тот же результат.
public async Task InsertOrUpdateUserByExternalId(UserModel user, CancellationToken cancellationToken = default)
{
if (user.User_ExternalID is null)
return false;
var userInDb = (await _db.Users
.AsNoTracking()
.FirstOrDefaultAsync(
u => u.User_ExternalID == user.User_ExternalID,
cancellationToken));
if (userInDb is not null)
{
user.User_ExternalID = null;
userInDb = user.Adapt();
_db.Users.Update(userInDb);
}
else
{
await _db.Users.AddAsync(user.Adapt(), cancellationToken);
}
var changes = _db.SaveChanges();
return changes == 1;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... -it-doesnt