【问题标题】:EntityFrameworkCore FromSqlRaw not mapping correctlyEntityFrameworkCore FromSqlRaw 未正确映射
【发布时间】: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


【解决方案1】:

将此代码添加到您的 EF 上下文中:

public virtual DbSet<ZoneSprocResult> ZoneSprocResults { get; set; }

并将您的模型构建器替换为:

   modelBuilder.Entity<ZoneSprocResult>(e =>
            {
                e.HasNoKey();
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 2016-10-05
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多