.net Find返回空对象

.net Find返回空对象,.net,asp.net-mvc,entity-framework,dbcontext,.net,Asp.net Mvc,Entity Framework,Dbcontext,我有3个不同的模型类:Product、ProductCategory和ProductSubcategory。它们都有适当的DbContext类,定义如下: public class ProductCategoryDBContext : DbContext { public DbSet<ProductCategory> ProductCategories { get; set; } } 及 问题是,第一个Find(Products)返回一个正确的

我有3个不同的模型类:Product、ProductCategory和ProductSubcategory。它们都有适当的DbContext类,定义如下:

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

    }


问题是,第一个Find(Products)返回一个正确的值,但两个latter为null。这是因为我从Products controller打电话来,这里有什么遗漏吗?

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

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

然后,这些实体之间很可能存在关系。当实体是相关的时,即使它们不显式地位于特定的上下文中,实体框架实际上会默默地将它们添加到上下文中,并为这些实体创建表等。换句话说,即使你将这些实体分离到不同的上下文中,如果它们是相关的,它们都在每个上下文中

最后,如果您将项添加到其中一个上下文中,而不是其他上下文中,查看数据库时,您可能会认为应该返回某些内容,但由于它们实际上不在其他上下文所表示的数据库中,因此当您从这些上下文中查询它们时,不会返回任何内容


长话短说,不要把上下文分开,或者如果你这样做了,要意识到其中的含义。您应该打破处于不同上下文中的实体之间的所有直接关系。否则,您将返回到相同的情况。

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

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

然后,这些实体之间很可能存在关系。当实体是相关的时,即使它们不显式地位于特定的上下文中,实体框架实际上会默默地将它们添加到上下文中,并为这些实体创建表等。换句话说,即使你将这些实体分离到不同的上下文中,如果它们是相关的,它们都在每个上下文中

最后,如果您将项添加到其中一个上下文中,而不是其他上下文中,查看数据库时,您可能会认为应该返回某些内容,但由于它们实际上不在其他上下文所表示的数据库中,因此当您从这些上下文中查询它们时,不会返回任何内容


长话短说,不要把上下文分开,或者如果你这样做了,要意识到其中的含义。您应该打破处于不同上下文中的实体之间的所有直接关系。否则,您将返回到相同的情况。

只需为您正在访问的每个数据库创建一个DbContext即可。根据您在该上下文中访问的类型创建一个数据库集。太棒了!这就是我需要的。今天又学到了一些新的东西(TY:)只要在访问的每个数据库中有一个DbContext。根据您在该上下文中访问的类型创建一个数据库集。太棒了!这就是我需要的。今天又学到了新东西(泰:)
  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.