繁体   English   中英

首先使用Database.SqlQuery从Entity Framework Code调用存储过程不起作用

[英]Calling stored procedure from Entity Framework Code First with Database.SqlQuery is not working

我正在尝试从DbContext调用存储过程,但是正在生成的SQL上出现错误。 EF生成的TSQL具有以下错误:

参数化查询需要参数...,但未提供

如何修复EF查询以创建对存储过程的正确调用?

我的代码如下所示。 它很长,但是很简单。 首先声明参数名称和存储过程名称。 然后使用DbContextDatabase.SqlQuery调用创建的SqlParamter的存储过程。 最后,它显示了此调用正在生成的SQL。

const string PayerId = "@PayerId";
const string ProviderId = "@ProviderId";
const string LineOfBusinessId = "@LineOfBusinessId";
const string PracticeLocationId = "@PracticeLocationId";
const string ClinicalCodingCategoryId = "@ClinicalCodingCategoryId";
const string FacilityName = "@FacilityName";
const string FacilityType = "@FacilityType";
const string ServiceDate = "@ServiceDate";
const string MilesFromPracticeLocation = "@MilesFromPracticeLocation";
const string GetPossibleSiteofServiceName = "getPossibleSiteofService";

var payerId = new Guid("5a4a16c3-d352-e411-80db-00155d66b519"); 
var providerId = new Guid("89516ad4-D852-E411-80DB-00155D66B519");
var lineOfBusinessId = new Guid("a2b3bcf3-9ab3-e311-80c3-00155d66cdf0"); 
var practiceLocationId = new Guid("36561da7-d852-e411-80db-00155d66b519"); 
var clinicalCodingCategoryId = new Guid("d541b72f-7ca3-e411-80db-00155d66b519");
string facilityName = null;
string facilityType = null;
Nullable<DateTime> serviceDate = null;
var milesFromPracticeLocation = 20;

using (var context = new AnalyticContext())
{
    var payerIdParameter = new SqlParameter(PayerId, payerId);
    var providerIdParameter = new SqlParameter(ProviderId, providerId);
    var lineOfBusinessIdParameter = new SqlParameter(LineOfBusinessId, lineOfBusinessId);
    var practiceLocationIdParameter = new SqlParameter(PracticeLocationId, practiceLocationId);
    var clinicalCodingCategoryIdParameter = new SqlParameter(ClinicalCodingCategoryId, clinicalCodingCategoryId);
    var facilityNameParameter = new SqlParameter(FacilityName, facilityName);
    var facilityTypeParameter = new SqlParameter(FacilityType, facilityType);
    var serviceDateParameter = new SqlParameter(ServiceDate, serviceDate);
    var milesFromPracticeLocationParameter = new SqlParameter(MilesFromPracticeLocation, milesFromPracticeLocation);

    var data = context.Database
                   .SqlQuery<PossibleSiteofService>(GetPossibleSiteofServiceName, payerIdParameter, 
                        providerIdParameter, lineOfBusinessIdParameter, 
                        practiceLocationIdParameter, 
                        clinicalCodingCategoryIdParameter, 
                        facilityNameParameter, facilityTypeParameter, 
                        serviceDateParameter, milesFromPracticeLocationParameter)
                   .FirstOrDefault();
            }

生成的SQL代码:

exec sp_executesql 
N'getPossibleSiteofService',
N'@PayerId uniqueidentifier,
@ProviderId uniqueidentifier,
@LineOfBusinessId uniqueidentifier,
@PracticeLocationId uniqueidentifier,
@ClinicalCodingCategoryId uniqueidentifier,
@FacilityName nvarchar(4000),
@FacilityType nvarchar(4000),
@ServiceDate nvarchar(4000),
@MilesFromPracticeLocation int',
@PayerId='5A4A16C3-D352-E411-80DB-00155D66B519',
@ProviderId='89516AD4-D852-E411-80DB-00155D66B519',
@LineOfBusinessId='A2B3BCF3-9AB3-E311-80C3-00155D66CDF0',
@PracticeLocationId='36561DA7-D852-E411-80DB-00155D66B519',
@ClinicalCodingCategoryId='D541B72F-7CA3-E411-80DB-00155D66B519',
@FacilityName=default,
@FacilityType=default,
@ServiceDate=default,
@MilesFromPracticeLocation=20

存储过程非常简单,如下所示:

[dbo].[getPossibleSiteofService]
    @PayerId UniqueIdentifier, --Required
    @ProviderId UniqueIdentifier, --Required
    @LineOfBusinessId UniqueIdentifier, --Required
    @PracticeLocationId UniqueIdentifier, --Required
    @ClinicalCodingCategoryId UniqueIdentifier, --Required
    @FacilityName varchar(255) = NULL, --Optional
    @FacilityType varchar(255) = NULL, --Optional
    @ServiceDate DateTime = NULL, --Optional Will Default to CURRENT DTM
    @MilesFromPracticeLocation int = NULL --Optional
AS
....

去年,我遇到了类似的问题,发现我的解决方案是:

解决此问题的方法(以我为例)

var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);

其中query是一个已插入参数的字符串,例如@Name等。parms变量是SQLParameters列表。 SQL不喜欢泛型列表。

SQL必须具有作为和object []发送的SQLParameters数组,而不是通用类型列表。

var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());

将存储过程添加到EDMX / Model就像添加表一样,然后可以使用上下文对象作为函数来访问存储过程

您需要执行以下操作:打开“ EDMX /模型”文件,然后打开“模型浏览器”并扩展“存储过程”节点,右键单击您的过程,然后单击“添加功能导入”

现在您可以像这样访问sp作为函数

context.getPossibleSiteofService(payerId, providerId, lineOfBusinessId, clinicalCodingCategoryId....., milesFromPracticeLocation)

**当使用SP作为函数时,不需要SQL参数,则可以在分配值后直接使用C#变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM