【发布时间】:2018-11-08 18:05:18
【问题描述】:
是否可以使用 EF Core FromSql 执行具有可选参数的存储过程?
我一直在测试一个简单的场景,用作将旧的 EF6 调用更新为 EF Core 调用的模板。我用作概念证明的测试示例:
CREATE PROCEDURE [dbo].[TestNullableParameters]
@addressId int = null,
@city nvarchar(100) = null,
@createdByUserId int
AS
BEGIN
select * from CRM..Address a
where (@addressId is null or a.AddressId = @addressId)
and (@city is null or a.City like @city)
and a.CreatedByUserId = @createdByUserId
END
我调用这个过程的测试代码:
[Test]
public void TestNullableParameters()
{
var procName = "exec CRM..TestNullableParameters ";
var context = _testContainer.Resolve<CRM2Context>();
var addressId = new SqlParameter("@addressId", 182);
var createdByUserId = new SqlParameter("@createdByUserId", 1620);
var parameters = new[] {addressId, createdByUserId};
var result = context.Address.FromSql(procName, parameters).ToList();
}
此代码不起作用,因为它指出该过程需要“@createdByUserId”,但未提供 - 它尝试将 createdByUserId 映射到 @city,然后没有值映射到 @createdByUserId。
如果我尝试定义一个值为 null 的参数 @city,它表明该过程需要 @city 的非 null 值。
如果我尝试显式添加仅包含@addressId 和@createdByUserId 的参数列表,则表明它缺少不可为空的@city。
【问题讨论】:
标签: c# entity-framework-core ef-core-2.1