无法在Entity Framework 6中执行存储过程

时间:2017-06-13 19:43:44

标签: c# sql-server entity-framework stored-procedures

我有一个使用EF6的应用程序。我需要执行存储过程,所以我执行以下操作:

using (SqlConnection conn = new SqlConnection(context.Database.Connection.ConnectionString))
{                      
    SqlCommand cmd = new SqlCommand("dbo.ExampleStoredProcedure", conn)
    {
        CommandType = CommandType.StoredProcedure
    };

    cmd.Parameters.Add(new SqlParameter("@param1", "parameterValue"));
    SqlDataAdapter da = new SqlDataAdapter { SelectCommand = cmd };

    durations = new DataSet();
    da.Fill(durations);                        
}

来自Web.config的我的连接字符串是:

<add name="MyEntities" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyServer\DEV;initial catalog=MyApp;User Id=UserId;Password=password123;Application Name=Connection Secured;integrated security=false;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

当上面的代码运行时,我得到一个例外:

Login failed for user 'UserId'.

该异常还包含SQL错误代码: 18456 。 我确认用户可以通过使用此SQL帐户登录SQL Server并运行相关存储过程来完全访问此SQL服务器,数据库,实例和存储过程。

我也尝试过定义一个新的SqlConnection对象:

 SqlConnection newCon = new SqlConnection("Server=MyServer\\DEV;Database=MyApp;User Id=UserId;Password = password123;");

并对它执行存储过程 - 这次工作。所以我确实有一个解决方法,但是想使用context.Database.Connection.ConnectionString对象来避免在web.config文件中有多个连接字符串。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

出于安全考虑,此行为是出于设计原因this回答了建议的问题。我补充道 <section class="section_one"> <ng-container *ngIf="!someCondition; else someTemplate"> </ng-container> </section> ... <section class="section_two"> <ng-container *ngIf="someCondition; else someTemplate"> </ng-container> </section> ... <ng-template #someTemplate> ... </ng-template> 到实体框架在web.config文件中生成的连接字符串,我能够重用 context.Database.Connection.ConnectionString 来使用ADO执行存储过程。

答案 1 :(得分:0)

您不需要(也不应该)为此打开单独的连接。您可以使用DbContext使用的相同连接。

只需打开连接(在处理DbContext时它将关闭)并将其强制转换为SqlConnection。例如

        db.Database.Connection.Open();
        var con = (SqlConnection)db.Database.Connection;