如何在实体框架和 EF Core 中使用 .Include()

是否可以以同时适用于 Entity Framework 6 和 EF Core 的方式使用 .Include()?


我目前有可以访问IQueryable<>但不知道其来源的命令处理程序,并且可以根据运行的上下文更改源。例如,在运行实际应用程序时使用 Entity Framework 6,但使用 EF Core 进行测试(使用 SQLite In Memory 提供程序)


using System.Data.Entity;


class DemoCommandHandler

{

    public void Handle(IQueryable<Blog> blogsQueryable, DemoCommand command)

    {

        //Need to get the blog and all the posts here

        var blogs = blogsQueryable.Include(b => b.Posts).Single(b => b.Id = command.BlogId);


        //Do stuff with blog and posts

    }

}

以上在使用实体框架时工作正常,但.Include()在运行 EF Core 时不起作用(注意using System.Data.Entity);


如果 using 语句更改为,using Microsoft.EntityFrameworkCore则它在运行 EF Core 时有效,但在 Entity Framework 中无效。


有没有办法使框架不可知.Include()?或者至少支持 EF Core 和实体框架?


喵喔喔
浏览 477回答 1
1回答

侃侃尔雅

您可以使用自己的扩展方法来执行此操作,该方法显式调用适当的扩展方法:public static class EntityFrameworkExtensions{&nbsp; &nbsp; public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, Expression<Func<T, TProperty>> path)&nbsp; &nbsp; &nbsp; &nbsp; where T : class&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; #if NETCOREAPP2_0&nbsp; &nbsp; &nbsp; &nbsp; return Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.Include(source, path);&nbsp; &nbsp; &nbsp; &nbsp; #else&nbsp; &nbsp; &nbsp; &nbsp; return System.Data.Entity.DbExtensions.Include(source, path);&nbsp; &nbsp; &nbsp; &nbsp; #endif&nbsp; &nbsp; }}但这只有在编译时已知目标框架时才有效。
打开App,查看更多内容
随时随地看视频慕课网APP