首页 > 解决方案 > 如何基于 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的答案中所述。

标签: c#.net-coreentity-framework-coreef-core-3.1

解决方案


问题是模型属性需要 setter 和 getter,即使模型是只读的。所以模型应该是

public class Model
{
    public string OrderId { get; set; }
}

推荐阅读