EF6 с Entity Framework Plus: добавление объекта из кэша памяти в коллекцию сущностей с последующим сохранением - PullRequest
0 голосов
/ 09 марта 2020

Я использую функцию кэширования EF Plus для кэширования часто используемых неизменяемых объектов поиска в памяти.

Все типы кэшированных объектов могут быть частью коллекции некоторых родительских объектов (ie: если у меня есть коллекция сущностей типа Product в кеше, я должен быть в состоянии добавить любую из них в коллекцию продуктов сущности Ордера с указанием, что «этот Орден состоит из этих Продуктов»)

Однако, когда я добавив один из кэшированных элементов в коллекцию «живого» объекта, я получаю следующее исключение:

{"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."}

Как мне это исправить? Autofa c зарегистрирован для создания InstancePerRequest () контекста, поэтому мне интересно, удерживает ли кэшированная сущность старый DbContext. Однако я бы подумал, что EFPlus по умолчанию отключил бы их.

Какова лучшая практика для кэширования объектов поиска, которые могут быть добавлены в свойства коллекции объектов?

Редактировать: я заметил это : https://entityframework.net/knowledge-base/27335291/how-to-detach-entity-from-context-when-you-no-longer-have-a-context-reference

Редактировать 2: Теперь я временно отключил создание прокси, но он все еще не работает. Вот код, который я получил, который является методом only для чтения из кэша (игнорируйте тот факт, что я возвращаю IQueryable здесь, я знаю, что это анти-паттерн, и он будет исправлен позже)

    public async Task<IQueryable<TEntity>> AsQueryable()
    {
        var proxyCreationEnabled = _context.Configuration.ProxyCreationEnabled;
        try
        {
            _context.Configuration.ProxyCreationEnabled = false;
            var unproxiedEntities = (await _dbSet.FromCacheAsync(_cacheKey)).AsQueryable();
            return unproxiedEntities;
        }
        finally
        {
            _context.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
        }
    }

Когда я добавляю кэшированную запись в коллекцию живого прокси-объекта, вот так:

var otherIntervention = await _otherInterventionRepository.GetByIdAsync(otherInterventionId); // reads the cache
toBeSaved.OtherInterventions.Add(otherIntervention);

Теперь ничего не происходит ... и да, otherInterventionId является первичным ключом сущность, которую я хочу добавить.

Вот что еще я пробовал: я пытался добавить новый объект OtherIntervention с только установленным полем Id, но я получаю ошибки проверки, так как поле [Required] Description отсутствует. Если бы я мог просто добавить новый объект в коллекцию OtherInterventions с полем идентификатора, равным полю записи EXISTING, я был бы счастлив. Я действительно не хочу создавать перегрузку GetByIdAsyn c, которая пропускает кэш и загружается непосредственно из контекста - тогда какой смысл кэш?

Редактировать 3: Похоже, у меня будет Прикрепить объект из кэша к контексту, к которому у меня нет доступа (его абстракция за хранилищем)

Как добавить элемент в хранилище без загрузки родительского элемента и братья и сестры в память

Редактировать 4: Прикрепление объекта из кэша дает мне ошибку, что объект того же типа с тем же Id уже существует!

Я сдаюсь пока. Это занимает слишком много времени, чтобы исправить.

Если кто-нибудь знает какие-либо исправления, пожалуйста, поделитесь. Спасибо.

...