我有一个名为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映射结果的方式,如果有,如何映射?
将此代码添加到EF上下文:
public virtual DbSet<ZoneSprocResult> ZoneSprocResults { get; set; }
并用以下内容替换您的模型生成器:
modelBuilder.Entity<ZoneSprocResult>(e =>
{
e.HasNoKey();
});