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

时间:2018-08-15 09:37:24

标签: c# entity-framework ef-core-2.0 ef-core-2.1

是否可以在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
    }
}

在使用Entity Framework时,以上方法工作正常,但是在运行EF Core时,.Include()不起作用(请注意using System.Data.Entity);

如果using语句更改为using Microsoft.EntityFrameworkCore,则在运行EF Core而不是Entity Framework时可以使用。

是否有使框架不可知的.Include()的方法?或至少同时支持EF Core和Entity Framework?

1 个答案:

答案 0 :(得分:1)

您可以使用自己的扩展方法来执行此操作,该方法显式调用相应的扩展方法:

public static class EntityFrameworkExtensions
{
    public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, Expression<Func<T, TProperty>> path)
        where T : class
    {
        #if NETCOREAPP2_0
        return Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.Include(source, path);
        #else
        return System.Data.Entity.DbExtensions.Include(source, path);
        #endif
    }
}

但是,只有在编译时就知道目标框架的情况下,这才起作用。