实体集未在实体容器

时间:2016-04-16 14:35:19

标签: c# entity-framework-6 system.data.sqlite

Cross posted on MSDN

我们首先使用手动代码实现System.Data.Sqlite的实体框架

因此,在创建新实体时,我们手动创建表,c#对象,并将DbSet添加到我们的上下文中。

我创建了一个非常简单的对象,并且在尝试查询上下文时遇到此错误。我已多次检查列名和数据类型,但我没有看到不匹配。即使字段的名称中包含id,也没有定义外键关系。只是一个独立的桌子。

最奇怪的部分是我可以在上下文中添加一个新实体,保存更改,并将其保存到数据库。但是在下一行中尝试检索我获得的实体时The entity set is not defined in the entity container错误。我还注意到,如果我将鼠标悬停在实例化的上下文上,则所有其他数据库集将具有SELECT EXTENT1.myCol as myCol之类的EF SQL,但department_resources集只显示{System.Data.Entity.DbSet<department_resource>}

关于这个问题的任何想法?

以下是我的文件摘录:

DDL

CREATE TABLE department_resources (
dep_res_key VARCHAR PRIMARY KEY, 
department_id INT NOT NULL, 
resource_id INT NOT NULL);

department_resource.cs

[Table("department_resources")]
public class department_resource 
{
    [Key]
    public string dep_res_key { get; set; }
    public int department_id { get; set; }
    public int resource_id { get; set; }
}

MyContext.cs

public class MyContext : DbContext
{
 public DbSet<department_resource> department_resources { get; set; }
}

样本使用

using (MyContext db = new MyContext())
{
    db.department_resources.Add(new department_resource() 
      { dep_res_key = "anID", 
        resource_id = 22, 
        department_id = 23 }); // Works

    db.SaveChanges(); // Also works. Even persists to db

    var foo = from r in db.department_resources 
              select r.resource_id; // Doesn't work. Will error as soon as I try to use foo. Like assigning to a combo box item source. Or even just enumerating the results

    var bar = db.department_resources; // Also doesn't work.

}

1 个答案:

答案 0 :(得分:1)

问题在于延迟执行。虽然您在foo块中指定了barusing,但在MyContext被处理后,它们才会被实际使用后才会被评估。

您需要强制它们在您的使用区块内进行评估。例如将结果转换为列表。

另外,我注意到您已在vars块中将其声明为using。它们需要在它之外定义才能在外面使用它们(也许你只是在你的样本中做了这个以简化?)

List<int> foo;
List<department_resource> bar;

using (MyContext db = new MyContext())
{
    db.department_resources.Add(new department_resource() 
      { dep_res_key = "anID", 
        resource_id = 22, 
        department_id = 23 }); // Works

    db.SaveChanges(); // Also works. Even persists to db

    foo = (from r in db.department_resources 
              select r.resource_id).ToList();

    bar = db.department_resources.ToList();

}

来自MSDN

  

查询变量本身只存储查询命令。实际上   延迟执行查询,直到您遍历查询   foreach语句中的变量。这个概念被称为   延期执行

     

强制立即执行

     

在一系列源元素上执行聚合功能的查询必须首先迭代   那些元素。此类查询的示例包括Count,Max,Average和   第一。这些执行时没有明确的foreach语句,因为   查询本身必须使用foreach才能返回结果。另请注意   这些类型的查询返回单个值,而不是IEnumerable   集合。

     

您也可以通过立即放置foreach循环来强制执行   在查询表达式之后。但是,通过调用ToList或ToArray你   还将所有数据缓存在单个集合对象中。