Рефакторинг EF6 в EF Core

c# entity-framework entity-framework-6 entity-framework-core

1057 просмотра

1 ответ

318 Репутация автора

Я пытался провести рефакторинг кода EF6 в EF Core 1 и столкнулся с небольшим камнем преткновения. Код, который я пытаюсь преобразовать, находится здесь:

https://github.com/mehdime/DbContextScope

Все в основном хорошо, но DbContextScope.cs, в частности, оказывается хитрым, например, этот метод (отредактированный для краткости):

        public void RefreshEntitiesInParentScope(IEnumerable entities)
    {
        foreach (IObjectContextAdapter contextInCurrentScope in 
            _dbContexts.InitializedDbContexts.Values)
        {
            var correspondingParentContext =
                _parentScope._dbContexts.InitializedDbContexts.Values
                    .SingleOrDefault(parentContext => 
                        parentContext.GetType() == contextInCurrentScope.GetType())
                           as IObjectContextAdapter;

            if (correspondingParentContext == null)
                continue;

            foreach (var toRefresh in entities)
            {
                ObjectStateEntry stateInCurrentScope;
                if (contextInCurrentScope.ObjectContext.ObjectStateManager
                        .TryGetObjectStateEntry(toRefresh, out stateInCurrentScope))
                {
                    var key = stateInCurrentScope.EntityKey;

                    ObjectStateEntry stateInParentScope;
                    if (correspondingParentContext.ObjectContext.ObjectStateManager
                       .TryGetObjectStateEntry(key, out stateInParentScope))
                    {
                        if (stateInParentScope.State == EntityState.Unchanged)
                        {
                            correspondingParentContext.ObjectContext.Refresh(
                                RefreshMode.StoreWins, stateInParentScope.Entity);
                        }
                    }
                }
            }
        }
    }

Вопросов.

Во-первых, я знаю, что могу заменить ObjectContext.ObjectStateManager новым ChangeTracker, но хочу убедиться, что полученная мной запись получена правильно. Как будет выглядеть следующая строка в EF Core?

contextInCurrentScope.ObjectContext.ObjectStateManager
    .TryGetObjectStateEntry(toRefresh, out stateInCurrentScope)

Во-вторых, что эквивалентно этому в EF Core?

correspondingParentContext.ObjectContext.Refresh

Спасибо!

Ps Есть много полезных комментариев в источнике на репозитории GitHub выше.

Автор: Richard Источник Размещён: 18.07.2016 10:09

Ответы (1)


1 плюс

1930 Репутация автора

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

var entry = contextInCurrentScope.Entry(toRefresh);
var keys = entry.Metadata.GetKeys();
var state = entry.State;

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

entry.Reload();
Автор: D-Jones Размещён: 12.12.2018 09:05
Вопросы из категории :
32x32