Find返回null对象

时间:2017-02-10 13:45:18

标签: .net asp.net-mvc entity-framework dbcontext

我有3个不同的模型类:Product,ProductCategory和ProductSubcategory。它们都有正确的DbContext类,如:

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

    }

现在在我的Product controller类上我也想访问其他表,所以我在那里:

  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)返回一个正确的值,但是两个latter为null。那是因为我从产品控制器打来电话,我在这里错过了什么?

1 个答案:

答案 0 :(得分:2)

每个DbContext大致相当于一个数据库。如果您的所有实体都属于一个数据库或者从Code First角度来看,您希望它们在一个数据库中一起存在,那么您应该只有一个上下文。

我在这里完全猜测,但最有可能的情况是,由于您正在处理三个上下文,Entity Framework正在查看三个不同的数据库。如果您让它处理数据库初始化(默认设置)并启用自动迁移(默认设置),这可以很容易地以静默方式发生。

然后,您很可能在这些实体之间建立关系。当实体相关时,即使它们没有明确地存在于特定上下文中,实体框架实际上也会静默地将它们添加到上下文中,并为这些创建表等。换句话说,即使你将这些实体分隔成不同的背景,如果它们是相关的,它们都在各种背景下。

最后,如果您将项目添加到其中一个上下文而不是其他上下文中,查看数据库,您可能会认为应该返回某些内容,但由于它们实际上并不在其他上下文所代表的数据库中,当你从这些上下文中查询它们时,你什么也得不回来。

长时间拍摄,不要将上下文分开,或者如果你这样做,请注意其含义。您应该打破不同上下文中的实体之间的所有直接关系。否则,你最终会在同样的情况下回来。