2017-02-10 173 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正在查看三个不同的数据库。如果您让它处理数据库初始化(默认设置)并启用自动迁移(默认),则可以轻松地默默发生。

然后,你很可能有这些实体之间的关系。当实体相关时,即使它们没有明确地在特定的上下文中,实体框架实际上默默地将它们添加到上下文中,并且将为这些实体创建表等。换句话说,即使你将这些实体隔离到不同的上下文中,但如果它们是相关的,它们都在每个上下文中。最后,如果将项目添加到其中一个上下文中,而不是其他项目中,则可能会认为应该返回某些内容,但由于它们实际上不在其他上下文所代表的数据库中,当你从这些上下文中查询它们时,你什么都得不到。

长时间投篮,不要分割上下文,或者如果你这样做,请注意它的含义。你应该打破处于不同背景下的实体之间的所有直接关系。否则,你会在这种情况下回到最后。