【发布时间】:2020-12-01 13:45:20
【问题描述】:
我有一个名为 GetZonesAssignedToCustomer 的存储过程,我正在使用实体框架核心,它正在复制映射。我检查了存储过程,并且在运行它时所有数据都是正确的SSMS。
我有一个看起来像这样的类:
public class ZoneSprocResult
{
public string Id { get; set; }
public string ParentId { get; set; }
public string Name { get; set; }
public int ZoneType { get; set; }
public string AddressId { get; set; }
public string StreamId { get; set; }
public bool IsEnabled { get; set; }
public string Tags { get; set; }
}
我正在调用这样的存储过程:
var a = await _context.Set<ZoneSprocResult>().FromSqlRaw(command).ToListAsync();
这是OnModelCreating中的样子
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/// other entities here
builder.Entity<ZoneSprocResult>()'
/// other entities here
}
但是,它返回了正确数量的记录,问题是 StreamId 重复。所以它几乎就像在这些记录上使用FirstOrDefault。
现在,我正在检查自己的理智并以相同的方法运行此代码:
var table = new DataTable();
using var connection = new SqlConnection("My ConnectionString");
using var sqlCommand = new SqlCommand(command, connection);
using var dataAdapter = new SqlDataAdapter(sqlCommand);
dataAdapter.Fill(table);
var checkList = new List<ZoneSprocResult>();
foreach (DataRow row in table.Rows)
{
var result = new ZoneSprocResult()
{
Id = row[0].ToString(),
ParentId = row[1]?.ToString()??String.Empty,
Name = row[2]?.ToString() ?? String.Empty,
ZoneType = int.Parse(row[3].ToString()),
AddressId = row[4].ToString(),
IsEnabled = bool.Parse(row[5]?.ToString()??"0"),
Tags = row[6].ToString(),
StreamId = row[7].ToString(),
};
checkList.Add(result);
}
当我将return a; 更改为return checkList; 时这是正确的
那么关于我的问题,有没有办法映射 FromSqlRaw 映射结果的方式,如果有,如何?
【问题讨论】:
-
为什么还要将行映射到属性?我觉得这是XY Problem
-
您的数据结果如何?我猜您的名称或类型不匹配,这导致了映射问题...
-
你试过用吗:var a = await _context.Set().FromSqlRaw(command).ToListAsync();不用强输入吗?因此,您将看到 FromSqlRaw 在没有转换为 ZoneSprocResult 的情况下返回给您的内容。至少这应该可以帮助您了解出了什么问题...
-
我已经更新了问题,我意识到我漏掉了
-
@David 我认为 EF Core 中没有非通用的
.Set()版本,如果他正确标记,这就是他正在使用的版本
标签: c# entity-framework .net-core entity-framework-core