问题:我正在尝试在实现IDataContext的控制器中运行存储过程。

我知道如何调用databaseContext.Database.SqlQuery <string> ...,但是在IDataContext中没有公开Database类。我正在寻找在Database接口中公开IDataContext类的正确方法的示例,以便可以正确模拟IDataContext并能够调用IDataContext.Database.SqlQuery<string>

public class MyController : ODataController
{
    private  IDataContext _db = new DataContext();

    [HttpPost]
    [ODataRoute("RunFile()")]
    public IHttpActionResult RunFile()
    {
        //..code omitted for brevity
        var result = _db.Database.SqlQuery<int>("exec MyStoredProc").ToList();
        return Ok(result);
    }
}


我已经看到了一个与我要问的问题类似的问题,但是我正在寻找此问题中发布的答案的示例。 link to Original post

基本上寻找如何在Database中公开IDataContext类的示例。

最佳答案

我建议不要泄漏该实现问题。而是通过更新界面仅公开所需的功能

public interface IDataContext {
    //...other members

    IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters);
    int ExecuteSqlCommand(string sql, params object[] parameters);
}


和实施。

public class DataContext : DbContext, IDataContext {
    //...other code removed for brevity

    public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters) {
        return Database.SqlQuery<TElement>(sql,parameters);
    }
    public int ExecuteSqlCommand(string sql, params object[] parameters) {
        return Database.ExecuteSqlCommand(sql,parameters);
    }
}


因此,现在依赖类只能使用所需的功能

public class MyController : ODataController {
    private readonly IDataContext db;

    public MyController(IDataContext db) {
        this.db = db;
    }

    [HttpPost]
    [ODataRoute("RunFile()")]
    public IHttpActionResult RunFile() {
        //..code omitted for brevity

        var result = db.SqlQuery<int>("exec MyStoredProc").ToList();
        return Ok(result);
    }
}

07-27 18:24