EntityFramework делает вид, что обновил строку, но это не такC#

Место общения программистов C#
Ответить
Anonymous
 EntityFramework делает вид, что обновил строку, но это не так

Сообщение Anonymous »

Я написал метод 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»