【问题标题】:Column mapping to unnamed columns到未命名列的列映射
【发布时间】:2021-05-16 13:34:10
【问题描述】:

我正在使用 Entity Framework Core 3 来尝试执行存储过程。我需要获取存储过程的返回值,但是,在存储过程中,没有名称。这是我执行存储过程的代码:

var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25}", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();

这是我的ArfmCreateEditRequestDto 课程:

public class ArfmCreateEditRequestDto
{
    [Column(Order = 0)]
    public string Retval { get; set; }
}

当我在 SQL Server 上执行此操作时,我得到以下结果:

--------------------------------------
| (No column name)                   |
--------------------------------------
| RequestID: 36 Succesfully Added    |
--------------------------------------

当我运行我的程序时,我得到一个异常提示

"System.InvalidOperationException: The required column 'Retval' was not present in the results of a 'FromSql' operation."

如果我把它改成这样:

    [Column("", Order = 0)]
    public string Retval { get; set; }

然后我得到这个异常:

"System.ArgumentException: The argument 'name' cannot be null, empty or contain only whitespace. (Parameter 'name')"

我真的认为第一件事会起作用,Entity Framework 只会将订单位置 0 的数据映射到我的属性,但显然它没有。

所以我的问题是,如果列在存储过程中未命名,如何捕获我的返回值?请注意,我根本无法更改存储过程。

【问题讨论】:

  • ArfmCreateEditRequestDto 看起来像什么?该存储过程的响应是什么?
  • 存储过程是否有返回值?可以分享一下存储过程的相关代码吗?
  • @DavidG - 我在我的问题中将代码发布到ArfmCreateEditRequestDto,并在我的问题中发布了对我存储过程的响应。
  • @ChetanRanpariya - 我在我的问题中发布了对我的存储过程的响应。它只返回一个未命名的varchar 列。

标签: c# asp.net-core entity-framework-core asp.net-core-3.1 entity-framework-core-3.1


【解决方案1】:

这是不可能的。使用有一些限制FromSqlRaw

1-SQL 查询必须返回实体类型的所有属性的数据。

2-结果集中的列名必须与属性映射到的列名匹配。请注意,此行为与 EF6 不同。 EF6 忽略了原始 SQL 查询的属性到列映射,结果集列名必须与属性名匹配

基于此链接:https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

但我认为您可以包装存储过程并将结果插入到具有任意列的临时表中,如下所示:

var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"create table #tmp( Retval nvarchar(128) ) insert into #tmp( Retval ) exec ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25} select Retval from #tmp", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多