Entity Framework - DBContext Equality
Я унаследовал немного кода, где существующий DBContext назначен локальной переменной следующим образом:
using(var context = new DBContext())
{
try
{
...
var localContext = context;
MethodThatAddsStuffToContext(localContext);
...
}
catch etc. etc.
context.SaveChanges();
}
Мой вопрос: я знаю, что различные контексты сохранят свои собственные изменения и что они будут восприняты другими контекстами только после сохранения, но:
- Используют ли контексты ссылочное равенство, что означает, что
context
а такжеlocalContext
выше будет делиться теми же дополнениями, а сохранение одного будет вносить изменения в другое? - Если у меня есть два существующих отдельных контекста, и я сохраняю один, будут ли изменения автоматически восприниматься в новом контексте при любом будущем запросе, или же контекст "кэшируется" в момент его создания (уверен, что ответ на этот вопрос это бывший, но просто хочу уточнить)?
- Является ли фрагмент кода выше плохой практики? Я не могу придумать ни одного обстоятельства, где это было бы целесообразно.
1 ответ
- Используют ли контексты ссылочное равенство, что означает, что контекст и localContext, приведенные выше, будут использовать одни и те же дополнения, а сохранение одного внесет изменения в другое?
Это не два контекста, это две ссылки на один и тот же контекст. Контексты являются ссылочными типами, а не типами значений. когда SaveChanges
называется, он вызывается по одному и только контексту. Неважно, если вы ссылаетесь на это из localContext
или же context
,
- Если у меня есть два существующих отдельных контекста, и я сохраняю один, будут ли изменения автоматически восприниматься в новом контексте при любом будущем запросе, или же контекст "кэшируется" в момент его создания (уверен, что ответ на этот вопрос это бывший, но просто хочу уточнить)?
Не совсем понятно, что вы имеете в виду под "кешем" и "сбором изменений". Нет кэширования сущностей, есть просто отслеживание изменений объектов сущностей, о которых знает контекст. Отслеживание изменений происходит для каждого контекста, что означает, что когда у вас действительно есть два независимых контекста, сохранение в одном контексте обновляет отслеживаемые объекты этого контекста. Другой контекст остается незатронутым этими изменениями, так как он не знает об объектах первого контекста.
- Является ли фрагмент кода выше плохой практики? Я не могу придумать ни одного обстоятельства, где это было бы целесообразно.
На этот вопрос нельзя ответить универсально. Если задействован только один контекст, и если оба context
а также localContext
никогда не меняются после назначения, код не имеет смысла и, по крайней мере, сбивает с толку (это сбило вас с толку, что доказывает суть). Однако существуют другие случаи, когда такое назначение имело бы смысл, например, когда задействовано несколько контекстов и localContext
может быть одним из них.