2017-02-10 19 views
0

У меня есть 3 разных класса моделей: Product, ProductCategory и ProductSubcategory. Все они имеют собственные классы DbContext определены как:Поиск возвращает нулевые объекты

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

    } 

Сейчас на моем классе контроллера продукта я хочу, чтобы получить доступ к этим другим таблицам тоже, так что у меня есть:

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. 

Проблема в том, что первое Find (Products) возвращает правильное значение, но два последних значения равны нулю. Это потому, что я звоню из Контроллера продуктов и есть что-то, что я пропустил здесь?

+4

Просто у вас есть один DbContext для каждой базы данных, к которой вы обращаетесь. Создайте DbSet для каждого типа, к которому вы обращаетесь в этом контексте. – krillgar

+0

Блестящий! Это то, что мне нужно. Узнал что-то новое сегодня снова TY :) – JussiJ

ответ

2

Каждый DbContext примерно эквивалентен одной базе данных. Если все ваши объекты принадлежат к одной базе данных или с точки зрения первого кода, вы хотите, чтобы все они были вместе в одной базе данных, тогда у вас должен быть только один контекст.

Я полностью угадываю здесь, но в основном вероятная ситуация заключается в том, что, поскольку вы работаете с тремя контекстами, Entity Framework рассматривает три разные базы данных. Это можно легко сделать без изменений, если вы разрешите ему обрабатывать инициализацию базы данных (по умолчанию) и включить автоматическую миграцию (по умолчанию).

Тогда у вас, скорее всего, есть отношения между этими сущностями. Когда сущности связаны друг с другом, даже если они явно не находятся в определенном контексте, Entity Framework фактически молча добавляет их в контекст и создает для них таблицы и т. Д. Другими словами, даже если у вас есть эти сущности, разделенные на разные контексты, если они связаны друг с другом, они все в каждом контексте.

Наконец, если вы добавляете элементы в один из этих контекстов, но не другие, глядя на базу данных, вы можете предположить, что что-то нужно вернуть, но поскольку они фактически не находятся в базах данных, представленных другими контекстами , когда вы запрашиваете их из этих контекстов, вы ничего не возвращаете.

Долгий и выстреленный, не разделяйте контекст, или если вы это делаете, помните о последствиях этого. Вы должны разорвать все прямые отношения между объектами, которые находятся в разных контекстах. В противном случае вы снова окажетесь в этой ситуации.