Entity Framework - DBContext Equality

Я унаследовал немного кода, где существующий DBContext назначен локальной переменной следующим образом:

using(var context = new DBContext())
{
  try
  {
     ...

     var localContext = context;
     MethodThatAddsStuffToContext(localContext);

     ...
   }
    catch etc. etc.

  context.SaveChanges();
}

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

  1. Используют ли контексты ссылочное равенство, что означает, что context а также localContext выше будет делиться теми же дополнениями, а сохранение одного будет вносить изменения в другое?
  2. Если у меня есть два существующих отдельных контекста, и я сохраняю один, будут ли изменения автоматически восприниматься в новом контексте при любом будущем запросе, или же контекст "кэшируется" в момент его создания (уверен, что ответ на этот вопрос это бывший, но просто хочу уточнить)?
  3. Является ли фрагмент кода выше плохой практики? Я не могу придумать ни одного обстоятельства, где это было бы целесообразно.

1 ответ

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

Это не два контекста, это две ссылки на один и тот же контекст. Контексты являются ссылочными типами, а не типами значений. когда SaveChanges называется, он вызывается по одному и только контексту. Неважно, если вы ссылаетесь на это из localContext или же context,

  1. Если у меня есть два существующих отдельных контекста, и я сохраняю один, будут ли изменения автоматически восприниматься в новом контексте при любом будущем запросе, или же контекст "кэшируется" в момент его создания (уверен, что ответ на этот вопрос это бывший, но просто хочу уточнить)?

Не совсем понятно, что вы имеете в виду под "кешем" и "сбором изменений". Нет кэширования сущностей, есть просто отслеживание изменений объектов сущностей, о которых знает контекст. Отслеживание изменений происходит для каждого контекста, что означает, что когда у вас действительно есть два независимых контекста, сохранение в одном контексте обновляет отслеживаемые объекты этого контекста. Другой контекст остается незатронутым этими изменениями, так как он не знает об объектах первого контекста.

  1. Является ли фрагмент кода выше плохой практики? Я не могу придумать ни одного обстоятельства, где это было бы целесообразно.

На этот вопрос нельзя ответить универсально. Если задействован только один контекст, и если оба context а также localContext никогда не меняются после назначения, код не имеет смысла и, по крайней мере, сбивает с толку (это сбило вас с толку, что доказывает суть). Однако существуют другие случаи, когда такое назначение имело бы смысл, например, когда задействовано несколько контекстов и localContext может быть одним из них.

Другие вопросы по тегам