如何基于 EF Core 中的查询创建对象(无键实体)?
How do I create objects based on a query in EF Core (keyless entities)?
我正在尝试将复杂 SQL 查询的结果映射到 EF Core 中的无键实体。 (由于必须处理预先存在的数据库,我基本上需要创建一个视图客户端。)
但是,在尝试检索我的数据时,我收到了 InvalidOperationException "Sequence contains no elements"。我可以将数据库中的基表映射到普通实体,所以我知道连接字符串是正确的。一个简化但完整的示例:
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 起),如 .
的答案中所述
问题是模型属性需要 setter 和 getter,即使模型是只读的。所以模型应该是
public class Model
{
public string OrderId { get; set; }
}
我正在尝试将复杂 SQL 查询的结果映射到 EF Core 中的无键实体。 (由于必须处理预先存在的数据库,我基本上需要创建一个视图客户端。)
但是,在尝试检索我的数据时,我收到了 InvalidOperationException "Sequence contains no elements"。我可以将数据库中的基表映射到普通实体,所以我知道连接字符串是正确的。一个简化但完整的示例:
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 起),如
问题是模型属性需要 setter 和 getter,即使模型是只读的。所以模型应该是
public class Model
{
public string OrderId { get; set; }
}