[英]Calling stored procedure from Entity Framework Code First with Database.SqlQuery is not working
我正在尝试从DbContext
调用存储过程,但是正在生成的SQL上出现错误。 EF生成的TSQL具有以下错误:
参数化查询需要参数...,但未提供
如何修复EF查询以创建对存储过程的正确调用?
我的代码如下所示。 它很长,但是很简单。 首先声明参数名称和存储过程名称。 然后使用DbContext
和Database.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.