EF 核心实体刷新



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

如果我插入一个只提供外键 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 对象嵌套,必须手动完成所有加载感觉真的很糟糕。

谢谢。

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

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;

我也发现没有简单的解决方法。 以下内容可能会使它更简单...

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

最新更新