c# - 如何基于 EF Core(无密钥实体)中的查询创建对象?
问题描述
我正在尝试将复杂 SQL 查询的结果映射到 EF Core 中的无键实体。(由于必须处理预先存在的数据库,我基本上需要创建一个视图客户端。)
但是,当尝试检索我的数据时,我得到一个 InvalidOperationException “序列不包含元素”。我可以将数据库中的基表映射到普通实体,所以我知道连接字符串是正确的。一个简化但完整的示例:
using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
class Program
{
static void Main(string[] args)
{
using (var db = new QueryDbContext())
{
List<Model> result = db.Orders.ToList(); // <-- exception occurs here.
Console.WriteLine($"Found: {result.Count}");
}
}
}
public class Model
{
public string OrderId { get; }
}
public class QueryDbContext : DbContext
{
public QueryDbContext()
: base()
{}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
_ = optionsBuilder
.UseSqlServer("myconnectionstring");
}
}
public DbSet<Model> Orders { get; set; }
private const string _OrdersSql =
"select top 5 orderid from tbl_orders order by transacttime desc";
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Model>(m =>
{
m.HasNoKey();
m.ToQuery(() => Set<Model>().FromSqlRaw(_OrdersSql));
});
}
}
Set<>()
是 Query<>() 的当前版本(自 EFCore 3.0 起),如FromSql with Non-Existing Entity的答案中所述。
解决方案
问题是模型属性需要 setter 和 getter,即使模型是只读的。所以模型应该是
public class Model
{
public string OrderId { get; set; }
}
推荐阅读
- javascript - 获取两个组件中的元素
- javascript - 如何在循环中执行异步代码?
- python - 如何使用来自 2 个列表的 python 列表理解创建字典
- android - 使用 AnimatedGifEncoder 在 Android 上生成 Gif
- reactjs - 我如何在异步函数中使用 promise.all 和 forEach
- laravel - 在实时服务器上安装 laravel 5.8 后,某些页面出现服务器错误
- arrays - Powershell 处理 CSV 文件
- node.js - 通过 Node.js 中的 API 将图像上传到 GitHub
- selenium - 如何在机器人框架中从当前选项卡切换到下一个打开的选项卡
- flutter - 如何用颤振制作搜索栏的自定义拇指?