我有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。那是因为我从产品控制器打来电话,我在这里错过了什么?
答案 0 :(得分:2)
每个DbContext
大致相当于一个数据库。如果您的所有实体都属于一个数据库或者从Code First角度来看,您希望它们在一个数据库中一起存在,那么您应该只有一个上下文。
我在这里完全猜测,但最有可能的情况是,由于您正在处理三个上下文,Entity Framework正在查看三个不同的数据库。如果您让它处理数据库初始化(默认设置)并启用自动迁移(默认设置),这可以很容易地以静默方式发生。
然后,您很可能在这些实体之间建立关系。当实体相关时,即使它们没有明确地存在于特定上下文中,实体框架实际上也会静默地将它们添加到上下文中,并为这些创建表等。换句话说,即使你将这些实体分隔成不同的背景,如果它们是相关的,它们都在各种背景下。
最后,如果您将项目添加到其中一个上下文而不是其他上下文中,查看数据库,您可能会认为应该返回某些内容,但由于它们实际上并不在其他上下文所代表的数据库中,当你从这些上下文中查询它们时,你什么也得不回来。
长时间拍摄,不要将上下文分开,或者如果你这样做,请注意其含义。您应该打破不同上下文中的实体之间的所有直接关系。否则,你最终会在同样的情况下回来。