Обновление сущности EF Core - PullRequest
1 голос
/ 30 января 2020

Я хотел бы, если есть способ вызвать ленивую загрузку объекта иерархии после того, как он был добавлен в кэш после вставки.

Если я вставляю объект, только предоставляя ему идентификаторы внешних ключей и пытаюсь чтобы запросить его сразу после этого, ни одно из этих свойств / коллекций не будет получено.

Пример:

            _dbContext.Set<MYTYPE>().Add(myObject);
            await _dbContext.SaveChangesAsync(ct);
            _dbContext.Entry(myObject).Collection(c => c.SomeCollection).Load();
            _dbContext.Entry(myObject).Reference(c => c.Property1).Load();
            _dbContext.Entry(myObject.Property1).Reference(c => c.NestedProperty).Load();
            _dbContext.Entry(myObject).Reference(c => c.Property2).Load();
            _dbContext.Entry(myObject).Collection(c => c.SomeCollection2).Load();
            _dbContext.Entry(myObject).Reference(c => c.Property3).Load();
            _dbContext.Entry(myObject).Reference(c => c.Property4).Load();
            _dbContext.Entry(myObject.Property4).Reference(c => c.SomeOtherNestedProperty).Load();
            _dbContext.Entry(myObject).Reference(c => c.Property5).Load();
            _dbContext.Entry(myObject).Reference(c => c.Property6).Load();

            return _dbContext.Set<MYTYPE>().Where(x => x.Id == myObject.Id); 

Если я не выполняю всю функцию Load () (иногда приходится вкладываться в несколько слоев ..) .), У меня не может быть загружено ни одного из вложенных свойств должным образом.

Примечание: выполнение

_dbContext.Entry(myObject).Reload()

или

_dbContext.Entry(myObject).State = EntityState.Detached;

не работает.

Есть идеи? Потому что у меня есть несколько таких случаев с вложением объектов HEAVY, и очень плохо, когда приходится делать все загрузки вручную.

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Дело в том, что если вы попытаетесь добавить некоторую строку, используя только целое число в качестве внешнего ключа, как показано ниже:

db.tablename.Add(new tablename{

            name = "hello",
            FK_IdofanotherTable = 5
            });
db.SaveChanges();

Тогда сущности не волнует немедленное связывание объекта, вы не будете получить доступ к связанному объекту как свойству.

Вот как это на самом деле делается в современной Entity Framework:

var TheActualCompleteObject = db.AnotherTable.First(t => t.id == 5);

db.tablename.Add(new tablename{

            name = "hello",
            AnotherTable = TheActualCompleteObject
            });
db.SaveChanges();

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

Если это невозможно, то вам придется запросить обратно ПОСЛЕ SaveChanges, чтобы получить ваш объект и получить доступ к внешним свойствам (с нетерпением загружая их, из Конечно, или это же катастрофа) * ​​1012 *

Пример:

       _dbContext.Configuration.LazyLoadingEnabled = false;
       _dbContext.Set<MYTYPE>().Add(myObject);
       await _dbContext.SaveChangesAsync(ct);
       var v = _dbContext.First(t => t.id == myObject.id);
       var fk_prop = v.Property1;
0 голосов
/ 30 января 2020

Я также не нашел простого способа обойти это. Следующее может сделать это проще ...

public static void Reset(this DbContext context)
    {
        var entries = context.ChangeTracker
                            .Entries()
                            .Where(e => e.State != EntityState.Unchanged)
                            .ToArray();
        foreach (var entry in entries) 
        { 
            switch (entry.State) 
            { 
                case EntityState.Modified: 
                    entry.State = EntityState.Unchanged; 
                    break; 
                case EntityState.Added: 
                    entry.State = EntityState.Detached; 
                    break; 
                case EntityState.Deleted: 
                    entry.Reload(); 
                    break; 
            } 
        }
    }

Надеюсь, это поможет!

JS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...