C# 如何禁用泛型类型的复杂类型字段的延迟加载?
我正在使用EF与我的数据库进行交互。 我已经实现了一个通用存储库:C# 如何禁用泛型类型的复杂类型字段的延迟加载?,c#,entity-framework,generics,lazy-loading,C#,Entity Framework,Generics,Lazy Loading,我正在使用EF与我的数据库进行交互。 我已经实现了一个通用存储库: public class GenericDbRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class 在MyDataContext OnModelCreating方法中,我链接模型: modelBuilder.Entity<Project>() .HasMany(
public class GenericDbRepository<TEntity>
: IGenericRepository<TEntity> where TEntity : class
在MyDataContext OnModelCreating方法中,我链接模型:
modelBuilder.Entity<Project>()
.HasMany(e => e.Tasks);
这对解决所描述的问题有很大帮助,但会产生另一个问题:任务未链接到项目,而且我总是得到空任务字段。所以,这不是一个选择
所以,问题是如何在上下文处理之前获取此类复杂类型字段的值。您可以尝试使用方法并在查询父实体之前包含所需的子属性。
关于加载相关实体导航属性导致错误的原因是,在加载导航属性之前,您正在处理上下文 为了避免此类错误,您可以使用通用存储库中的
Include
方法,急切地加载项目的任务
,例如,您可以执行以下操作:
public virtual T FindElement(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties)
{
T item = null;
using (var context = new Entities())
{
IQueryable<T> dbQuery = context.Set<T>();
//Apply eager loading
foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
dbQuery = dbQuery.Include<T, object>(navigationProperty);
item = dbQuery
.FirstOrDefault(where); //Apply where clause
}
return item;
}
public virtual T FindElement(Func-where,参数表达式[]导航属性)
{
T项=null;
使用(var context=new Entities())
{
IQueryable dbQuery=context.Set();
//应用即时加载
foreach(navigationProperties中的表达式navigationProperty)
dbQuery=dbQuery.Include(navigationProperty);
item=dbQuery
.FirstOrDefault(where);//应用where子句
}
退货项目;
}
使用此方法,您可以找到一个应用倍数的元素,在您的情况下,可以采用以下方式:
var repository=new GenericDbRepository<Project>();
var project=repository.FindElement(p=>p.Id==23, p=>p.Tasks, p=>p.State);
var repository=新的GenericDbRepository();
var project=repository.FindElement(p=>p.Id==23,p=>p.Tasks,p=>p.State);
由于链接腐烂,不鼓励只指向StackOverflow外部链接的答案。请直接将相关示例发布到您的答案中。这是一个很好的决定,以防您事先知道模型类型,不幸的是,我有一个泛型,不知道应该使用哪种类型。在模型创建步骤中有没有可能做到这一点?这是解决我的问题的一个方法,但我发现存在一些障碍。如果参数navigationProperties是可选的就可以了,但在这种情况下它是必需的,否则我会得到一个异常,所以这不是很好。我不明白你为什么说这不是一个好的解决方案,这是对泛型类型执行多个包含的标准方法。抛出此异常时,您试图执行什么操作?是否包含实体的所有导航属性?我已经更新了我的答案,检查结尾我必须指出一些额外的信息,我想避免这样做。有没有其他方法可以解决这个问题?我恐怕这是唯一可行的解决方案,当你有一个escenario,你的环境被处理。
modelBuilder.Entity<Project>()
.HasMany(e => e.Tasks);
public MyDataContext()
: base("name=MyDataContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
public virtual T FindElement(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties)
{
T item = null;
using (var context = new Entities())
{
IQueryable<T> dbQuery = context.Set<T>();
//Apply eager loading
foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
dbQuery = dbQuery.Include<T, object>(navigationProperty);
item = dbQuery
.FirstOrDefault(where); //Apply where clause
}
return item;
}
var repository=new GenericDbRepository<Project>();
var project=repository.FindElement(p=>p.Id==23, p=>p.Tasks, p=>p.State);