查找返回空对象
问题描述:
我有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控制器吗,有没有我在这里错过的东西?
答
每个DbContext
大致相当于一个数据库。如果您的所有实体都属于一个数据库或来自代码优先的角度,那么您希望它们全都在一个数据库中,那么您应该只有一个上下文。
我完全猜测在这里,但最可能的情况是,因为你正在处理三个上下文,Entity Framework正在查看三个不同的数据库。如果您让它处理数据库初始化(默认设置)并启用自动迁移(默认),则可以轻松地默默发生。
然后,你很可能有这些实体之间的关系。当实体相关时,即使它们没有明确地在特定的上下文中,实体框架实际上默默地将它们添加到上下文中,并且将为这些实体创建表等。换句话说,即使你将这些实体隔离到不同的上下文中,但如果它们是相关的,它们都在每个上下文中。最后,如果将项目添加到其中一个上下文中,而不是其他项目中,则可能会认为应该返回某些内容,但由于它们实际上不在其他上下文所代表的数据库中,当你从这些上下文中查询它们时,你什么都得不到。
长时间投篮,不要分割上下文,或者如果你这样做,请注意它的含义。你应该打破处于不同背景下的实体之间的所有直接关系。否则,你会在这种情况下回到最后。
只需为每个正在访问的数据库创建一个DbContext。在该上下文中为每种类型创建一个DbSet。 – krillgar
辉煌!这就是我需要的。今天又学到了新东西TY :) – JussiJ