我想将我的DbContext配置为在调用Set<T>()
时渴望加载某些属性。给定以下类别:
public class Thing
{
public int Id { get; set; }
public int OtherThingId { get; set; }
public OtherThing OtherThing { get; set; }
}
public class OtherThing
{
public int Id { get; set; }
}
public class MyContext : DbContext
{
protected override void OnModelCreating( ModelBuilder modelBuilder )
{
modelBuilder.Entity<Thing>();
modelBuilder.Entity<OtherThing>();
}
}
如何配置EF Core,以便在我打电话时:
var myThing = new MyContext().Set<Thing>().First();
那么myThing.OtherThing
不是null
吗?
我知道,如果我有上下文,那么当我知道要查询的事物的类型时,可以使用Include
/ ThenInclude
方法来渴望加载特定的属性。但是我希望能够注入一个对EF一无所知的通用存储库接口,例如:
public interface IRepository
{
Task<T> GetAsync<T>( int id );
}
我希望能够实现使用MyContext
的该接口,然后分别配置EF,以便仅使用Set<T>()
将包括我配置的任何属性,而无需调用那些扩展方法/创建我的接口API EF特定?
在ModelBuilder
上似乎没有可以用来实现此目标的方法。基本上我想要的是:
modelBuilder.Entity<Thing>().Include(x => x.OtherThing);
答案 0 :(得分:0)
喜欢吗?
var dbSet = DbContext.Set<T>();
var properties = typeof(T)
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p=> p.SetMethod !=null);
var queryable = default(IQueryable<T>);
properties.ForEach(p => { queryable = (queryable ?? dbSet).Include(p.Name); });
return queryable;