从DbContext获取ObjectContext后无法访问实体,该如何解决?
解决ObjectContext下访问实体集的问题
我来帮你搞定这个问题!你遇到的oc.Students不显示的情况,主要是因为ObjectContext对实体集的命名和访问方式和DbContext不一样,下面给你几个靠谱的解决方案:
1. 最推荐:用CreateObjectSet<T>()直接获取实体集
不管你的实体集在ObjectContext里叫什么名字,这个泛型方法都能直接拿到对应的集合,完全不用纠结命名问题,代码示例:
var oc = ((IObjectContextAdapter)MyEntities).ObjectContext; // 直接获取Student实体的集合 var students = oc.CreateObjectSet<Student>();
这样students就和你之前用DbContext的MyEntities.Students功能完全一致,支持查询、修改等所有操作。
2. 找到ObjectContext中实体集的正确名称(如果想用属性访问)
如果你非要用oc.XXX的属性方式访问,得先确认实体集在ObjectContext里的真实名称:
- 如果你用的是模型优先(EDMX):打开你的EDMX文件,找到
<EntityContainer>节点,里面的<EntitySet>的Name属性就是ObjectContext里的属性名。比如:
那你就可以直接用<EntityContainer Name="MyEntitiesContainer"> <EntitySet Name="Students" EntityType="MyModel.Student" /> </EntityContainer>oc.Students;如果Name是StudentSet,那就要用oc.StudentSet。 - 如果你用的是Code First:默认的实体集名称是实体类名的复数形式(比如
Student→Students),但如果你的DbContext里的DbSet属性自定义了名称,那ObjectContext里的实体集名称会和DbSet的属性名一致。
要是智能感知没显示出来,也可以直接手动输入正确的名称,或者清理解决方案后重新编译一下,有时候是VS的智能感知缓存问题。
3. 额外注意点
如果你的DbContext是Code First的,还可以通过oc.GetObjectSet<Student>()来获取,效果和CreateObjectSet一样,不过CreateObjectSet是更通用的写法。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

