Entity Framework - 我的对象上下文在哪里?

17

好的,很明显我错过了一些非常基本的东西。我对Entity Framework非常陌生。

我想调用存储过程而不导入它们,因此我打算使用ExecuteStoreQuery()。根据文档,ExecuteStoreQuery是ObjectContext的一个方法。但是,我不知道从哪里获取我的ObjectContext。

我使用Database First生成了实体。到目前为止,我一直像这样访问我的实体:


-->

我显然缺少一些非常基础的东西。对于Entity Framework我很新手。

我想要调用存储过程而不必导入它们,所以我计划使用ExecuteStoreQuery()函数。按照文档,ExecuteStoreQuery是ObjectContext的一个方法。但是,我不知道该如何获取我的ObjectContext对象。

我是通过 Database First 方法生成的实体模型。到目前为止,我一直是这样访问我的实体模型的:

var db = new MyEntities();

PRODUCT p = db.PRODUCTS.First(a => a.PRODUCTSKEY == thekey);

但我无法调用db.ExecuteStoreQuery,因为db不是ObjectContext。

我已经搜索了如何从实体中获取ObjectContext。我找到了一些答案,但它们都带有警告标志,说这是一个解决方法,只有在没有其他选项时才使用。那么,什么是正确的方法呢?

我找到的所有使用ExecuteStoreQuery的示例都假定您已经拥有了ObjectContext。这并不是很有帮助。

我发现一个网站说, ObjectContext是由Entity Framework“自动生成”的。如果是这样,那它在哪里呢?

我显然错过了非常简单的东西。这不能太困难了。


db.ExecuteStoreQuery()? - jrummell
@jrummell 不是的。db 是一个 DbContext 实例,它没有这样的方法:http://msdn.microsoft.com/zh-cn/library/system.data.entity.dbcontext(v=vs.113).aspx - Alex Bitek
3个回答

36

要获取您的DbContext的ObjectContext,您只需要执行以下操作:

var objectContext = ((IObjectContextAdapter)myDbContextObject).ObjectContext;

13

ObjectContext 在Entity Framework 4.1中被 DbContext 替换。实际上,DbContextObjectContext 的一个适配器(封装)。如果需要获取 ObjectContext,可以将 DbContext 实例转换为 IObjectContextAdapter 接口(这个接口是显式实现的),封装的 ObjectContext 实例将会可用:

ObjectContext context = ((IObjectContextAdapter)db).ObjectContext;

顺便说一下,我认为你正在寻找db.Database.SqlQuery方法。


3
实际上,替代发生在EF 4.1中,随着Code-First的引入,参见此链接:http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction-and-model.aspx。 - Corey Adler

1
在您的情况下,MyEntities 是您的 ObjectContext。
从技术上讲,它是由 EntityFramework 自动生成的类,继承自 ObjectContext 类。

好的,如果我尝试:MyEntities.ExecuteStoreQuery(MyQuery),编译器会说MyEntities“不包含‘ExecuteStoreQuery’的定义”。 - JoeMjr2
其他人是正确的,这取决于您使用的EF版本,对于EF4及更早版本,您应该能够按照此处的步骤进行操作:http://blogs.microsoft.co.il/blogs/gilf/archive/2009/03/06/mapping-stored-procedures-to-objectcontext-methods.aspx - Sebastian K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接