在API上我需要动态包含但是EF Core不支持基于String的包含.
因此我创建了一个映射器,它将字符串映射到添加到列表中的lambda表达式:
List<List<Expression>> expressions = new List<List<Expression>>();
Run Code Online (Sandbox Code Playgroud)
请考虑以下特定类型:
public class EFContext {
public DbSet<P1> P1s { get; set; }
public DbSet<P1> P2s { get; set; }
public DbSet<P1> P3s { get; set; }
}
public class P1 {
public P2 P2 { get; set; }
public P3 P3 { get; set; }
}
public class P2 {
public P3 P3 { get; set; }
}
public class P3 { }
Run Code Online (Sandbox Code Playgroud)
Include和ThenInclude通常使用如下:
EFContext efcontext = new EFContext();
IQueryable<P1> result = …Run Code Online (Sandbox Code Playgroud) 如何告诉DBContext的Find方法它应该急切地加载导航属性/实体?
我有以下代码删除与相关辅助实体的关联:
Person primary = db.People.Find(Id);
if (primary == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
// This line is required to load the related entity
db.Entry(primary).Reference("Secondary").Load();
primary.Secondary = null;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我不得不添加这条线db.Entry(primary).Reference("Secondary").Load();以使其正常工作.我理解这是因为实体框架正在使用延迟加载.我可以在Find方法中覆盖它,并通过使用Find方法的Eager版本摆脱额外的行吗?
我正在使用实体框架,并希望在 Repository 类中创建通用的GetById方法并预先加载:
这是我使用延迟加载的方法:
public virtual TEntity GetById(object id)
{
return DbSet.Find(id);
}
Run Code Online (Sandbox Code Playgroud)
我知道Find方法不支持急切加载,但是如何修改此方法以使用急切加载,因此我按如下方式使用此方法(例如):
_unitOfWork.MyRepository.GetById(includeProperties: "Users");
Run Code Online (Sandbox Code Playgroud)