获取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;
我正在使用以下代码获取 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;