使用Set <t>()时配置渴望加载的属性

时间:2018-07-14 12:52:47

标签: c# entity-framework-core

我想将我的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);

1 个答案:

答案 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;