В чем разница между прикреплением и обновлением? - PullRequest
0 голосов
/ 05 марта 2020

Я удивлен, что, несмотря на то, что потратил довольно много времени на поиск ответа, я не нашел его в inte rnet сам. Что еще более удивляет меня, так это то, что люди склонны сравнивать Attach to Add, а не с Update. Кроме того, я нашел очень мало упоминаний о реальном методе обновления, несмотря на то, что он, казалось бы, является наиболее очевидным выбором для желаемой операции изменения.

Из материалов, которые мне удалось найти, я понял, что Attach следует использовать, когда Вы знаете, что объект существует где-то в базе данных. Если вы не внесете в него изменения, никакие операции над объектом не будут выполнены, а если вы это сделаете - он будет обновлен. Но тогда зачем вам обновление, если оно делает то же самое из его звука?

У меня есть этот фрагмент кода, который я взял из курса udemy.

MovieController.cs

[HttpPut("{id}")]
        public IActionResult ReplaceMovie(long id, [FromBody] Movie m)
        {
            if (ModelState.IsValid)
            {   
               ////
               // logic in question starts here vvv
               ////
                m.MovieId = id;
                if (m.Studio != null && m.Studio.StudioId != 0)
                {
                    context.Attach(m.Studio);
                }
                context.Update(m);
                context.SaveChanges();
                return Ok();
            }
            else
            {
                return BadRequest(ModelState);
            }
        }

Но тогда почему бы просто не сделать это таким образом?

m.MovieId = id;
context.Update(m);
context.SaveChanges();
return Ok();

Не приведет ли это к тому же результату, поскольку мы знаем, что в случае с Mov ie ему уже присвоено значение Studio, затем оно (Studio) существует в базе данных, и нам не нужно вносить в него какие-либо изменения?

Теперь, если мы применили некоторые изменения к mov ie AND к Студийные объекты, тогда не было бы безопаснее просто выполнить модификации обновлений в их отдельных контроллерах? Например, если я хочу обновить mov ie и студию, я сначала вызову StudioController, который будет выполнять операцию модификации в Studio, а затем вызову MovieController для обновления mov ie.

Какой подход будет оптимальным для лучшей гибкости и ясности? Что я должен знать об Присоединении и Обновлении в целом?

1 Ответ

2 голосов
/ 05 марта 2020

.Update помечает сущность как измененную. Обновление может использоваться для начала отслеживания сочетания новых и существующих объектов, где существующие объекты могут иметь некоторые модификации. Новые сущности будут вставлены, а существующие сущности будут обновлены.

.Attach пометит сущность как находящуюся в неизменном состоянии. Однако сущности будут переведены в состояние «Добавлено», если они имеют сгенерированные хранилищем ключи (например, столбец «Идентичность») и значение ключа не было установлено. Это означает, что при использовании исключительно ключей, генерируемых магазином, Attach может использоваться для начала отслеживания сочетания новых и существующих объектов, где существующие объекты не изменились. Новые сущности будут вставлены, пока существующие сущности не будут сохранены, кроме как для обновления любых необходимых значений FK.

Информация об источнике:

Зачем использовать Attach для обновления Entity Framework 6?

https://blog.oneunicorn.com/2016/11/17/add-attach-update-and-remove-methods-in-ef-core-1-1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...