EF 6 Code First存储过程 - 只读

时间:2014-02-23 15:29:43

标签: c# entity-framework stored-procedures ef-code-first

我搜索了一些帖子,但是很短。我首先使用EF6代码尝试从已在数据库中设置的存储过程中获取结果。我的应用程序很简单,它从两个不同的服务器获取数据,执行一些业务逻辑,然后向用户显示。我可以使用.edmx文件,它将函数映射到xml文件中。当我使用Power Tools向自己展示XML文件时,我没有看到下面代码中的函数导入,所以我要么缺少设置,要么我无法使用ExecuteFunction()

  1. 我可以先使用ExecuteFunction()代码吗?我的存储过程只返回记录。我有这个设置的原因是因为存储过程提供另一个应用程序,我们希望在一个地方(SSMS)保留对查询的所有更改。我知道我可以使用ExecuteStoredQuery / ExecureStoredCommand,但如果我要使用.edmx模型,我想坚持惯例。

  2. 如果我可以使用ExecuteFunction,我在哪里以及如何配置DbContext来识别存储过程?在我的设置下面,我收到错误

  3.   

    在容器{1}

    中找不到FunctionImport {0}

    我可以使用Fluent API吗?感谢。

        public class JobContext : DbContext
        {
            public JobContext()
                : base("name=JobContext")
            {
                // My context will only define a slice of the database
                Database.SetInitializer<JobContext>(null);
            }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.ComplexType<Job>();
            }
    
            public virtual ObjectResult<Job> uspGetJobs(string startDate)
            {
                var startDateParameter = startDate != null ?
                    new ObjectParameter("startDate", startDate) :
                    new ObjectParameter("startDate", typeof(string));
    
                return ((IObjectContextAdapter)this).ObjectContext.<Job>("uspGetJobs", startDateParameter);
            }
        }
    

1 个答案:

答案 0 :(得分:6)

因为它是一个只读存储过程,所以我最终做了这个,而不是试图模仿生成的模型。

 public virtual List<Jobs> uspGetJobs(string startDate)
 {
    var startDateParameter = startDate != null ?
                             new SqlParameter("startDate", startDate) :
                             new SqlParameter("startDate", typeof(string));

    return this.Database.SqlQuery<PlannedJobs>("uspGetPlannedJobs @startDate, @locationCode", startDateParameter, locationCodeParameter).ToList();
 }