EF 6.0 中缺少 DbSet<entity>.Load() 函数

Posted

技术标签:

【中文标题】EF 6.0 中缺少 DbSet<entity>.Load() 函数【英文标题】:DbSet<entity>.Load() function missing in EF 6.0 【发布时间】:2013-11-05 12:09:46 【问题描述】:

我正在尝试访问DbSet&lt;EntityClass&gt;.Load() 函数来加载实体。 EF 6.0 中不再存在此功能;经过某些调查,我发现它是 EF 扩展库中定义的扩展方法的一部分。

我获得了 EF 6.0 扩展库的参考 NuGet 包,但似乎不再受支持。我试图通过调用.ToList() 来替代该函数,但是这个方法在处理时返回了一个内部异常:

("The column name is not valid. [ Node name (if any) = Extent1,Column name = HasErrors ]" )

我根据数据库表仔细检查了映射类,但它看起来不错。不知道我错过了什么。下面是我的映射类的代码:

internal class CustomerMapping : EntityTypeConfiguration<Customer>

    public CustomerMapping()
    
        this.HasKey(t => t.Id);

        this.Property(t => t.Id).HasColumnName("CUSTOMER_ID");
        this.Property(t => t.Name).HasMaxLength(30).HasColumnName("NAME");
        this.Property(t => t.Email).HasMaxLength(30).HasColumnName("EMAIL");
        this.Property(t => t.PhoneNo).HasMaxLength(100).HasColumnName("PHONE_NO");
        this.Property(t => t.MobileNo).HasMaxLength(100).HasColumnName("MOBILE_NO");
        this.Property(t => t.Address1).HasMaxLength(100).HasColumnName("ADDRESS1");
        this.Property(t => t.Address2).HasMaxLength(100).HasColumnName("ADDRESS2");
        this.Property(t => t.CustomerType).HasMaxLength(100).HasColumnName("CUSTOMER_TYPE");
        this.Property(t => t.Notes).HasMaxLength(100).HasColumnName("NOTES");

        this.ToTable("CUSTOMERS");
    

以下是对数据库的实际调用:

internal class EntityService : IEntityService

    private ObservableCollection<Customer> customers;


    public DBContextManager DataBaseContext  get; set; 

    public ObservableCollection<Customer> Customers
    
        get
        
            if (customers == null && DataBaseContext != null)
            
               // DataBaseContext.Set<Customer>().Load()
                DataBaseContext.Set<Customer>().ToList();
                customers = DataBaseContext.Set<Customer>().Local;

            
            return customers;
        
    

还有谁能指出ToList()Load()的区别?

【问题讨论】:

根据MSDN,Load“相当于在没有实际创建列表的情况下调用ToList”,它是IQueryable的扩展,位于System.Data.Entity命名空间中,所以请确保您为此添加using 是的,我正在使用该命名空间。但是如何调试未发现被投诉的列名? 哦,ToList() 不填 Local 这就是为什么我必须先加载:( 【参考方案1】:

我发现我需要添加:

using System.Data.Entity;

【讨论】:

【参考方案2】:

此外,除了 System.Data.Entity 之外,您还必须添加 System.Linq 命名空间以及 System.Windows。

【讨论】:

【参考方案3】:

在 EF6 中,包含扩展方法的类已从 DbQueryExtensions 重命名为 QueryableExtensions,但 .Load() 方法仍为 there。如果你不直接调用这个扩展方法,那么重命名对你来说应该没有关系。

【讨论】:

【参考方案4】:

DbSet.ToList() 将返回给定集合中的所有项目,并将填充 DbSet.Local 属性。您可以调用 ToList() 或 Load()。您不需要引用 Local 属性,您可以手动创建 ObservableCollection。

return new ObservbableCollection<Customer>(DataBaseContext.Set<Customer>().ToList());

ToList() 和 Local 之间可能存在差异。例如,如果这不是您第一次对客户集执行查询,则本地可能包含无效数据,如果数据在网络上被删除。

【讨论】:

以上是关于EF 6.0 中缺少 DbSet<entity>.Load() 函数的主要内容,如果未能解决你的问题,请参考以下文章

在 EF6 中是不是有可能有一个 DbSet<T> 仅存在于内存中,而其余的是真实表?

使用带有DbSet的接口,可以使用EF Core吗?

EF查询 linq写法 DbContext.DbSet<TEntity>

EF 6不同的DbSet名称来自它所持有的类

使用 EF DbSet 对数据进行排序 [关闭]

ASP.NET EF - DbContext 的 DbSet 未更新