Я использую Entity Framework 6 с MySQL.
Вставка в порядке, я смог вставить новую запись. но когда я попытался обновить только что созданную запись. Обновляет все строки.
Вот мой код для сохранения.
// This is the method I use every time I save a record.
public async Task SaveAsync(User model)
{
if (model.Id != 0)
{
var original = GetOriginal(model.Id);
if (model.Password == string.Empty)
{
model.Password = original.Password;
}
// The state is always modified if I'm updating the record.
var state = Context.Entry(model).State;
}
await base.SaveAsync();
}
Когда я сохраняю запись, которую хочу обновить, вот запрос на обновление. Entity Framework использует хранимую процедуру User_Update, но в ней отсутствует предложение where, поэтому обновления влияют на все строки.
`User_Update`
-- Id: '6' (Type = Int32, IsNullable = false)
-- Username: 'test123' (Type = String, IsNullable = false, Size = 7)
-- Password: 'vZxTTTgLiQUxwchySt1e1o/I9XMWm4QW5pO6MpPGI0o=' (Type = String, IsNullable = false, Size = 44)
-- Email: 'test1@gmail.com' (Type = String, IsNullable = false, Size = 15)
-- FullName: 'test1' (Type = String, IsNullable = false, Size = 5)
-- CreatedAt: 'null' (Type = DateTime, IsNullable = false)
-- UpdatedAt: 'null' (Type = DateTime, IsNullable = false)
-- RoleId: '2' (Type = Int32, IsNullable = false)
-- Executing asynchronously at
-- Completed in 9 ms with result: 6
Обновление:
Добавлена команда SaveCommand, которая выполняет команду SaveAsync
private async void SaveCommandExecute(object obj)
{
//var passwords = (Tuple<string, string>) obj;
//var password = passwords.Item1;
//var confirmPassword = passwords.Item2;
var result = await DialogHelper.ShowAsync("Are you sure you want to continue?", "Confirmation",
MessageDialogType.YesNo);
if (result)
{
await UserWrapper.ValidateAll();
if (!UserWrapper.HasErrors)
{
if (UserWrapper.Id == 0)
{
UserWrapper.Password = DbHelper.CalculateHash(UserWrapper.FakePassword, UserWrapper.Username);
}
await _userRepository.SaveAsync(UserWrapper.Model);
HasChanges = false;
Id = UserWrapper.Id;
SetTitle();
((DelegateCommand<object>)SaveCommand).RaiseCanExecuteChanged();
await LoadAsync(UserWrapper.Id);
}
}
}
Теперь мой вопрос: как я скажу EF добавить идентификатор записи в предложении where?
PS: эта логика прекрасно работает с SQL Server Entity Framework. Я не уверен, почему это не работает в MySQL EF.
Я также отслеживал, есть ли какие-либо изменения в репозитории / текущем dbcontext, если есть какие-либо изменения и нет ошибок, я включу кнопку «Сохранить» / команду «Сохранить».