2017-02-10 222 views
0

我有3個不同的模型類:Product,ProductCategory和ProductSubcategory。他們都有類似規定適當的DbContext類:查找返回空對象

public class ProductCategoryDBContext : DbContext 
    { 
     public DbSet<ProductCategory> ProductCategories { get; set; } 

    } 

現在我的產品控制器I類要訪問這些其他表也一樣,所以我必須有:

public class ProductsController : Controller 
    { 
     private ProductDBContext db = new ProductDBContext(); 
     private ProductCategoryDBContext dbCat = new ProductCategoryDBContext(); 
     private ProductSubcategoryDBContext dbSubcat = new ProductSubcategoryDBContext(); 
... 
} 

public ActionResult Details(int? id) 
{ 
     Product product = db.Products.Find(1); 
     ProductCategory Category = dbCat.ProductCategories.Find(1); 
     ProductSubcategory Subcat = dbSubcat.ProductSubcategories.Find(1); 
.... 
} 

(I have hardcoded the key values for clarity to make sure that they really are on database. 

問題是第一次查找(產品)返回一個適當的值,但兩個後者爲空。那是因爲我打電話給Products控制器嗎,有沒有我在這裏錯過的東西?

+4

只需爲每個正在訪問的數據庫創建一個DbContext。在該上下文中爲每種類型創建一個DbSet。 – krillgar

+0

輝煌!這就是我需要的。今天又學到了新東西TY :) – JussiJ

回答

2

每個DbContext大致相當於一個數據庫。如果您的所有實體都屬於一個數據庫或來自代碼優先的角度,那麼您希望它們全都在一個數據庫中,那麼您應該只有一個上下文。

我完全猜測在這裏,但最可能的情況是,因爲你正在處理三個上下文,Entity Framework正在查看三個不同的數據庫。如果您讓它處理數據庫初始化(默認設置)並啓用自動遷移(默認),則可以輕鬆地默默發生。

然後,你很可能有這些實體之間的關係。當實體相關時,即使它們沒有明確地在特定的上下文中,實體框架實際上默默地將它們添加到上下文中,並且將爲這些實體創建表等。換句話說,即使你將這些實體隔離到不同的上下文中,但如果它們是相關的,它們都在每個上下文中。最後,如果將項目添加到其中一個上下文中,而不是其他項目中,則可能會認爲應該返回某些內容,但由於它們實際上不在其他上下文所代表的數據庫中,當你從這些上下文中查詢它們時,你什麼都得不到。

長時間投籃,不要分割上下文,或者如果你這樣做,請注意它的含義。你應該打破處於不同背景下的實體之間的所有直接關係。否則,你會在這種情況下回到最後。