Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何禁用泛型类型的复杂类型字段的延迟加载?_C#_Entity Framework_Generics_Lazy Loading - Fatal编程技术网

C# 如何禁用泛型类型的复杂类型字段的延迟加载?

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(

我正在使用EF与我的数据库进行交互。 我已经实现了一个通用存储库:

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);