从延迟加载模型创建DbQuery

时间:2019-08-08 18:08:48

标签: c# entity-framework-core lazy-loading sql-view ef-core-2.1

是否可以从具有延迟加载的导航属性的模型创建DbQuery?当我尝试这样做时,出现以下错误

  

从“ Castle.Proxies.ExtendedStudentProxy”的“前缀”中获取值->由于是查询类型,因此无法跟踪“ Ex​​tendedStudent”类型的实例,只能跟踪实体类型。

我认为DbQuery是只读的,因此不应该将它们不作为默认行为进行跟踪吗?我错了吗?

这是我使用的代码示例:

型号:

public class ExtendedStudent {
    public string FirsName {get; set;}
    public virtual Prefix Prefix {get; set;}
}

public class Prefix {
    public int Id {get; set;}
    public string Name {get; set;}
}

Startup.cs

   builder.AddDbContext<ApplicationDbContext>( b => b.UseLazyLoadingProxies()
       .UseSqlServer(connectionString));

ApplicationDbContext.cs

public class ApplicationDbContext {

    ...
    public DbSet<Proxy> Proxies {get; set;}
    public DbQuery<ExtendedStudent> ExtendedStudents {get; set;}
    ...
}

1 个答案:

答案 0 :(得分:1)

是的,未跟踪它们。这是默认的(也是唯一的)行为。我认为例外是一种比较笨拙的说法。一个非跟踪类型包含一个跟踪实体会很奇怪。另外,请注意,没有用于查询类型的映射API来定义关系,因此显然不支持该映射。

之所以无法做到这一点,主要原因是可以从任何类型的SQL查询查询类型,并且不能保证查询类型后面的查询是可组合的。完全有可能从存储过程中填充查询类型。然后,SQL无法(更不用说EF)将结果与表连接起来以填充导航属性。