2016-04-16 49 views
0

Cross posted on MSDN實體集未在實體容器中定義

我們採用手工代碼第一個實體框架System.Data.Sqlite

因此,創建一個新的實體時,我們手動創建表時,C#對象,並將DbSet添加到我們的上下文中。

我有一個非常簡單的對象創建,我收到這個錯誤,當試圖查詢上下文。我已經多次查看了列名和數據類型,但是在這裏我看不到任何不匹配。即使字段中的名稱中包含id,也沒有定義外鍵關係。只是一個獨立的桌子。

最奇怪的部分是我可以添加一個新的實體到上下文中,保存更改,它會被持久保存到數據庫。但是在下一行嘗試檢索實體時,我得到了The entity set is not defined in the entity container錯誤。我還注意到,如果我將鼠標懸停在實例化的上下文上,則所有其他數據庫集都將具有EF SQL,例如SELECT EXTENT1.myCol as myCol,但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

你檢查數據庫嗎?這是保存 – Eldho

+0

是的,它被保存在db – wesmantooth

+0

你可以請嘗試通過啓動一個新的數據庫上下文'使用(MyContext db = new MyContext())'並試圖獲取這個新的上下文 – Eldho

回答

1

問題是延遲執行。雖然您要在using區塊內指定foobar,但在MyContext已被處置後,它們纔會被評估,直到它們被實際使用。

您需要強制他們在您的使用區塊內進行評估。例如通過將結果轉換爲列表。

另外我注意到您已在using區塊內聲明它們爲vars。他們將需要定義之外呢,能夠在室外使用它們(也許你只是你的樣品中這樣做是爲了簡化?)

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,您還可以將所有數據緩存在單個集合對象中。

+0

我實際上正在使用'(from r in db.department_resources select r.resource_id).ToList();'最初但刪除了ToList()以故意推遲執行並幫助排除故障。我希望看到一個Select語句或有用的東西,但在foo上懸停時沒有select語句可用。只需'{System.Data.Entity.Infrastructure.DbQuery }'。添加'ToList()'返回錯誤發生在同一行的'foo'賦值 – wesmantooth

+0

對不起,我很難過。我看不到任何可能導致它的代碼。我建議更新你的問題以包含'virtual'關鍵字,在你的示例代碼中添加一個例子,你可以在其中強制執行評估(例如用'ToList()'),或者添加一個屏幕截圖,當你將鼠標懸停在'db '。也許別人會看到一個問題。也許嘗試從模型中重新生成數據庫,看看它是否會拋出任何錯誤(並檢查它創建的表等),並仔細檢查以確保問題中的代碼完全符合您的要求。 – Tone