获取Entity Frameworkreturns所有导航对象

Get Entity Framework returns all navigation objects

我正在使用以下代码获取 EF 中的对象,问题是返回的对象包含所有导航对象。例如,具有 courseId 的对象 Customer。当我得到那个 Customer 时,它有 Course 对象,在 Course 中有他的导航对象等等。这是进入基本存储库的好方法吗?如果我不使用任何包含,为什么我要让客户获得所有外键对象,而不仅仅是客户?我从msn页面复制功能:

Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application (9 of 10)

这是代码:

public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,
    Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
    string includeProperties = "")
{
    IQueryable<TEntity> query = dbSet;

    if (filter != null)
    {
        query = query.Where(filter);
    }

    foreach (var includeProperty in includeProperties.Split
        (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
    {
        query = query.Include(includeProperty);
    }

    if (orderBy != null)
    {
        return orderBy(query).ToList();
    }
    else
    {
        return query.ToList();
    }
}

在上面的代码中,如果您不传递 includePropertis,则它不包含任何属性,如果您传递 "Property1,Property2",则它包含 Property1、Property2 导航属性。

如果启用延迟加载(默认情况下启用),导航属性会在第一次访问引用 entity/entities 的 属性 时自动从数据库加载。

所以在这种情况下,您可以在创建上下文时以这种方式关闭延迟加载:

var db= new YourDbContext();
db.Configuration.LazyLoadingEnabled = false;

或者在 YourDbContext class:

public class YourDbContext: DbContext 
{ 
    public YourDbContext () 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}

对于那篇文章,修复它的一个好点是 UnitOfWork class.

的构造函数

想了解更多,在继续阅读那篇好文章之前,您可以先看看:

好吧,我不太明白你需要什么,但我会给你一个答案。

要在实体 Costumer 中进行延迟加载,您需要:

public virtual Course {get; set;}
public int CourseId {get; set;}

当你有一个对象类型 Costumer 时,这样你就可以得到 Course get load,例如

var course = costumer.Course;