EF核心实体刷新

时间:2020-01-30 16:30:54

标签: entity-framework .net-core

我想是否有一种方法可以在插入对象之后将其添加到缓存中之后触发对象层次结构的延迟加载。

如果我插入仅提供外键ID的对象,然后尝试立即请求它,则不会检索到这些属性/集合。

示例:

            _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 个答案:

答案 0 :(得分:1)

问题是,如果您尝试仅使用整数作为外键来添加某些行,如下所示:

db.tablename.Add(new tablename{

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

然后实体不关心立即链接对象,您将无法将链接的对象作为属性访问。

这是在现代实体框架中实际完成的方式:

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

db.tablename.Add(new tablename{

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

所以...基本上,您无论如何都会加载对象,它不会使任何事情变得更快,但是会更加一致。您将能够浏览外键属性。

如果这不可能,那么您将必须在SaveChanges之后进行查询,以检索您的对象并可以访问外部属性(当然,急于加载它们,否则将是同样的灾难)

示例:

       _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;

答案 1 :(得分:0)

我也没有找到解决此问题的简便方法。 以下内容可能会使其更简单...

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