dbcontext.SaveChanges ();не обновляется при замене модели - PullRequest
0 голосов
/ 22 октября 2019

У меня проблема с Entity Framework 6.

Я пытаюсь обновить существующую сущность, но я бы хотел полностью заменить ее вместо обновления каждого отдельного свойства по одному. Когда я заменяю свойство и вызываю SaveChanges(), оно отлично сохраняется в базе данных, однако, если я хочу просто заменить весь объект, оно ничего не делает.

Закомментированная часть ниже будет работать, очевидно,но когда я пытаюсь заменить объект (в моем случае объект ninja.ToModel(), который происходит из модели представления ниндзя), он не работает.

Очевидно, что я что-то упустил, я думаю, что это должно сделатьс Attach(), но пока все, что я нашел в интернете, только смутило меня. Какой правильный подход для полного обновления объекта, как я хочу?

public void SaveNinja()
{
    using (var context = new ManagerEntities())
    {
        Ninja nin = context.Ninjas.Find(ninja.ToModel().Id);

        // nin.Name = ninja.Name;
        // nin.Strength = ninja.Strength;
        // nin.Agility = ninja.Agility;
        // nin.Intelligence = ninja.Intelligence;
        // nin.Gold = ninja.Gold;

        context.SaveChanges();
    }

    Close();
}

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Только следующая строка находит Ninja объект, который соответствует Id, который вы передаете. Очевидно, что он не обновляет свойства найденного объекта, поскольку вы не говорите ему об этом.

Ninja nin = context.Ninjas.Find(ninja.ToModel().Id);

Если вы не хотите устанавливать свойства объекта одно за другим, вы можете использовать публичный методэто так.

public class Ninja
{
    public string Id { get; set; }
    public string Name { get; set; }

    public void SetNinja(Ninja ninja)
    {
        Id = ninja.Id;
        Name = ninja.Name;
    }
}

Затем вызовите его, когда найдете объект:

Ninja nin = context.Ninjas.Find(ninja.ToModel().Id);
nin.SetNinja(ninja);
0 голосов
/ 22 октября 2019

Итак, если вы загружаете экземпляр модели, вам просто нужно изменить значения и сохранить их. Вы не хотите, чтобы база данных распознавала два экземпляра, представляющих одни и те же данные модели.

Однако, если вы ничего не загружаете из базы данных, и вы делаете это полностью самостоятельно, чтобы заменить запись базы данных,тогда вам нужно сделать две вещи, чтобы это работало:

  1. Убедитесь, что поле основного идентификатора (похоже, вы назвали его Id здесь) установлено так же, какобъект, подлежащий замене.

  2. Перед сохранением выполните следующее:

    db.Attach(ninja).State = EntityStates.Modified;
    

    Этот фрагмент кода выполняет две функции. Во-первых, он присоединяет базу данных к объекту (по сути говоря, «это экземпляр этой модели, которую вы должны использовать»).
    Затем, во-вторых, он устанавливает State в Modified, что сообщает базе данныхнеобходимо записать обратно на диск при вызове SaveChanges().

...