Как сохранить связанные данные из другого DbContext в EF Core? - PullRequest
0 голосов
/ 15 октября 2018

Я пытался создать CMS с использованием .NET Core 2.1 с возможностью поэтапного изменения веб-контента, поэтому у меня есть три сайта в архитектуре моей системы:

  1. Сайт CMS - пользователь может предложитьизменения в веб-контенте через CMS, и эти изменения будут отправлены на промежуточный / производственный сайт после одобрения администратором.
  2. промежуточный интерфейс - веб-интерфейс для внутренних целей UAT отображает весь утвержденный / неутвержденный веб-контент.
  3. Производственный веб-интерфейс - веб-интерфейс, предназначенный для широкой публики, отображает только утвержденный веб-контент.

У меня есть три DbContext экземпляра, введенных для достижения вышеуказанного:

  1. CmsContext - хранит изменения первого веб-контента, предложенные пользователем.
  2. StagingContext - где промежуточный веб-интерфейс читает веб-контент
  3. ProductionContext - гдеПроизводственный веб-интерфейс читает веб-контент

Проблема, с которой я столкнулся при попытке выполнить следующее (с включенной отложенной загрузкой):

var entity = await stagingContext.FindAsync(entityType, entityId);
productionContext.Update(entity);
await productionContext.SaveChangesAsync();

свойства навигации не обновляются так, как я ожидал.

Я также пробовал подход ChangeTracker.TrachGraph, но он не перебирает свойства навигации.

IСледует понимать, что причина может заключаться в том, что даже при включенной отложенной загрузке к свойствам навигации никогда не было доступа, поэтому они не заполняются значениями для productionContext для обновления.

Я прочитал в MicrosoftДо того, как я отправлю этот вопрос, я не смог найти правильный способ сделать это.Могу ли я получить вашу помощь в этом ребята?спасибо

1 Ответ

0 голосов
/ 15 октября 2018

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

Вы должны заменить FindAsync вызов на Include, чтобы загрузить все необходимые свойства навигации, а затем использовать SingleOrDefaultAsync или SingleAsync.Поскольку свойства загружаются лениво, они никогда не загружаются, потому что вы никогда не получаете к ним доступ, и EF Core не имеет ничего для отслеживания при вызове productionContext.Update(entity);

Я не думаю, что вызов Update обеспечивает доступ к любым свойствам для отложенной загрузки вработать, он просто устанавливает EntityState.Я не уверен, если вызов SaveChangesAsync изменит это.Но если это не сработает, то возможно, что он не загружается лениво.

Если вы просто хотите загружать все, что вам нужно, вы можете взглянуть на Entity Framework Core 2.0.1.связанные лица

...