2010-08-30 97 views
2

我想用一個參數來執行存儲過程,該參數使用EF4「Code First」返回表。對於這個目的,我確信一些DTO,它不必返回實體。我曾嘗試:實體框架4 - 代碼優先和存儲過程

一)創建函數導入EDMX文件,並將其添加到我的ObjectContext的是這樣的:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.RegisterEdmx("Model.edmx"); 
} 

但我得到了InvalidOperationException說:「現有模型的註冊不能代碼後,第一次使用使用流利API的配置已經啓動。「

b)獲得下屬的連接並執行該過程:

var connection = this.objectContext.UnderlyingContext.Connection; 
    connection.Open(); 
    DbCommand command = connection.CreateCommand(); 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "booklog.Recommendations"; 
    command.Parameters.Add(
     new EntityParameter("userId", DbType.Guid) { Value = this.userId }); 
    var reader = command.ExecuteReader(); 
    // etc. 

其中

public class MyObjectContext : DbContext 
{ 
    public System.Data.Objects.ObjectContext UnderlyingContext 
    { 
     get { return this.ObjectContext; } 
    } 

    // .... 
} 

,但這種方法並不能正常工作。它拋出InvalidOperationException帶有消息「在當前工作空間中找不到FunctionImport指定的容器'booklog'」。

+2

在EF 4 Code First CTP 5中,'DbContext'中沒有'ObjectContext'屬性。相反,使用'Database'屬性。 – 2011-01-14 18:15:48

回答

5

好吧,b)是正確的,但不一定要使用UnderlyingContext,只是ObjectContext.Database.Connection。代碼如下:

var connection = this.objectContext.Database.Connection; 
    connection.Open(); 

    DbCommand command = connection.CreateCommand(); 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "Recommendations"; 
    command.Parameters.Add(
     new SqlParameter("param", DbType.Guid) { Value = id }); 

    var reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     // ... 
    } 

    connection.Close();