【发布时间】:2020-03-16 02:14:05
【问题描述】:
我有分页,我想使用简单的 sql (EF7) 在同一个查询中选择计数:
var selectSql = " SELECT TotalCount = COUNT(*) OVER(), E.* FROM [table] E ...";
var rows = context.Set<EventTable>().FromSql<EventTable>(selectSql, parameters.Select(p => p.Value).ToArray()).ToArray();
此选择有效,但我的 EventTable 类中没有 TotalCount 属性,因为我不想在数据库中使用该属性。
我尝试从实体跟踪器获取 TotalCount 属性:
var row = rows.First();
var entity = context.Entry(row);
var totalCount = entity.Property<int>("TotalCount").CurrentValue;
然后我得到错误: 找不到实体类型“EventTable”的属性“TotalCount”。确保该属性存在并已包含在模型中。
然后我尝试像这样在模型中添加属性:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<EventTable>(b => b.Property<int>("TotalCount"));
}
当我想选择时它工作正常,但它在插入时抛出异常,因为数据库中的列不存在。 EF 将在迁移中添加该列。但我注意到,如果在迁移生成之前添加行 b.Property("TotalCount");到 ModelSnapshot 类中,它将避免在迁移时添加属性。但是插入的问题依然存在。
我尝试创建另一个类:
[NotMapped]
public class EventSearchTable : EventTable
{
[Column("total_count")]
[Required]
public int TotalCount { get; set; }
}
然后这样做:
var rows = context.Set<EventSearchTable>().FromSql<EventSearchTable>(..);
它适用于 EF6,但不适用于 EF7,我收到错误:值不能为空。 参数名称:entityType 因为我的 DbContext 中没有实体。如果我将在我的 DbContext 上添加 EventSearchTable 类,那么它将期望诸如鉴别器等列,并将在迁移中创建表。
任何想法如何获取属性 TotalCount ?
【问题讨论】: