Entity Framework CTP5 - 如何调用存储过程?

9
这可能是一个简单的答案,但我不知道如何在EF CTP5中执行存储过程。
在Entity Framework 4.0中,我们使用以下代码来实现:
```ExecuteFunction("ContainerName.StoredProcName", new ObjectParameter("Id", id))```
这是ObjectContext上的一个方法。
但是DbContext没有这样的方法。
我们该怎么调用存储过程呢?EF CTP5不支持吗?
编辑:我在这个帖子中找到了此操作步骤:this thread
  var people = context.People.SqlQuery("EXECUTE [dbo].[GetAllPeople]");

这引发了一些担忧:
1)现在你是在set上调用存储过程,而不是在context中。存储过程应该在整个上下文中都可用,而不是绑定到特定的实体集。就像在 SQL Server 中它们在“数据库”下面,而不是在“表”下面一样。
2)那么复杂类型怎么办?我以前有一个从存储过程返回的复杂类型。但现在看起来你必须直接映射到一个实体?这没有任何意义。我有很多存储过程返回的类型并非直接由 ObjectSet/DBSet 表示,我无法想象如何将它们移植过来。
希望有人能为我解决这个问题,因为从我目前的理解来看,我将无法升级到 CTP5。
1个回答

9
您可以像这样执行数据库范围的SQL语句。
using(var context = new MyContext())
{
    // custum sql statement
    var c = context.Database.SqlQuery<int>("SELECT COUNT(*) FROM Employees");

    // returned entity type doesn't have to be represented by ObjectSet/DBSet
    var e = context.Database.SqlQuery<Employee>("SELECT * FROM Employees");

    // stored procedure
    var q = context.Database.SqlQuery<Employee>("GetEmployees");
}

2
这回答了你的第一个问题。存储过程(sp)在整个上下文中都是可用的。DbContext.Database是内置DbDatabase对象的引用。这与context.People.SqlQuery不同,后者操作DbSet。 - Steven K.
1
从我的评论中可以看出:“sp's are available context-wide.”。这应该改为“Database-wide”,因为您可以查询与上下文无关的数据。 - Steven K.

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