Установите для Entity State значение Modified для объектов с разными ссылками - PullRequest
0 голосов
/ 22 декабря 2018

Я работаю над приложением WPF, используя шаблон MVVM, также сначала я использую код EF для объектов базы данных.и из-за MVVM я использую AutoMapper для отображения объектов из базы данных «Модели» в «ViewModels».

Когда я обновляю сущность, мне нужно отобразить ее обратно из модели представления в модель и передать ее методу обновления

public void Update(TEntity entity)
{   
    TEntity databaseEntity = Context.Set<TEntity>().Find(entity.Id);
    DbEntityEntry dbEntityEntry = Context.Entry(databaseEntity);
    dbEntityEntry.CurrentValues.SetValues(entity);  
    dbEntityEntry.State = EntityState.Modified;
}

Проблема здесь в том, что мне нужно получать сущность каждый раз, когда яЯ хочу обновить его, и если у меня будет много объектов для обновления, это вызовет проблемы с производительностью.Я попытался использовать следующий код, но он не сработал, потому что автоматическое отображение создало новый экземпляр объекта, отличный от того, который был прикреплен с EF dbConext.

public void Update(TEntity entity)
{
    DbEntityEntry<TEntity> dbEntityEntry = Context.Entry(entity);
    dbEntityEntry.State = EntityState.Modified;
}

Я попытался справиться с этим, переопределив Equals иМетоды GetHashCode, но они также не работали.

Есть ли способ обработки объекта обновления без получения его из базы данных?

Спасибо.

1 Ответ

0 голосов
/ 22 декабря 2018

Поскольку вы отслеживаете изменения вручную, вы не должны сохранять ссылку на тот же самый dbcontext.Прочитайте ваши данные внутри оператора Using, который выводит новости и удаляет dbcontext.Когда вы записываете данные обратно в новую сущность, присвойте им свойства из вашей модели представления, измените ее состояние и сохраните изменения.Снова откройте и закройте ваш dbcontext вокруг этого.
Тогда нет необходимости искать нужную вам сущность.

Вот тривиальный пример, если это объяснение было неясным.Это не является лучшим корпоративным решением - я бы ожидал, по крайней мере, универсальный метод updateentityasync.Мы обновляем личность в таблице людей.

    public async Task<bool> UpdatePersonAsync(Person person)
    {
        int numUpdated = 0;
        using (var db = new AndyPeopleContext())
        {
            db.People.Add(person);
            db.Entry(person).State = EntityState.Modified;
            numUpdated = await db.SaveChangesAsync();
        }
        return numUpdated == 1;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...