我们首先使用手动代码实现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.
}
答案 0 :(得分:1)
问题在于延迟执行。虽然您在foo
块中指定了bar
和using
,但在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你 还将所有数据缓存在单个集合对象中。