You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# EF Core中WorkflowData表与视图关联查询及导航属性配置问题

问题解决:EF Core关联无键视图与实体查询失败

问题根源

你遇到的错误是因为WorkflowDataDynamicColumn是无键视图实体(通过HasNoKey()配置),EF Core不支持将无键实体作为一对多关系的子实体——常规的HasMany/WithOne关系依赖主键-外键约束,而视图没有主键,导致导航属性WorkflowData.WorkflowDataDynamicColumns无法被EF Core识别为有效关系。

解决方案

步骤1:移除无效的关系配置

先删除WorkflowData实体配置里的无效关系代码:

modelBuilder.Entity<WorkflowData>(entity =>
{
    entity.Property(x => x.IsActive).HasDefaultValue(true);
    // 移除以下三行无效的关系配置
    // entity.HasMany(x => x.WorkflowDataDynamicColumns)
    //     .WithOne()
    //     .HasForeignKey(x => x.WorkflowDataId);
});

步骤2:补全实体属性(若需要)

你的WorkflowDataFormColumnDto中用到了Id,但当前WorkflowDataDynamicColumn实体没有定义该属性。请确认视图vw_WorkflowDataDetails中是否存在对应的Id列,若存在,需在实体类中添加:

public class WorkflowDataDynamicColumn
{
    public int Id { get; set; } // 新增,对应视图中的Id列
    public int WorkflowDataId { get; set; }
    public string? Value { get; set; }
}

步骤3:修改查询逻辑,显式关联视图数据

不再依赖导航属性,直接通过WorkflowDataId关联视图数据,用子查询或Join方式获取对应动态列:

子查询方式

var query = _context.WorkflowDatas
    .AsNoTracking()
    .Include(x => x.WorkflowStatus)
    .Where(x => x.WorkflowStatus != null)
    .Select(wd => new WorkflowDataDto
    {
        Id = wd.Id,
        WorkflowStatus = _mapper.Map<WorkflowStatusDto>(wd.WorkflowStatus),
        FormColumn = _context.WorkflowDataDynamicColumns
            .Where(dc => dc.WorkflowDataId == wd.Id)
            .Select(dc => new WorkflowDataFormColumnDto
            {
                Id = dc.Id,
                Value = dc.Value ?? string.Empty,
            }).ToList()
    })
    .ToListAsync();

Join方式(大数据量场景更优)

var query = from wd in _context.WorkflowDatas.AsNoTracking()
            join dc in _context.WorkflowDataDynamicColumns 
                on wd.Id equals dc.WorkflowDataId into dynamicColumnsGroup
            where wd.WorkflowStatus != null
            select new WorkflowDataDto
            {
                Id = wd.Id,
                WorkflowStatus = _mapper.Map<WorkflowStatusDto>(wd.WorkflowStatus),
                FormColumn = dynamicColumnsGroup
                    .Select(dc => new WorkflowDataFormColumnDto
                    {
                        Id = dc.Id,
                        Value = dc.Value ?? string.Empty,
                    }).ToList()
            };

var result = await query.ToListAsync();

关键说明

  • 无键实体无法参与EF Core的常规关系映射,必须通过显式关联的方式查询数据。
  • 确保视图vw_WorkflowDataDetails的字段与WorkflowDataDynamicColumn实体属性完全匹配(列名、数据类型一致)。

内容的提问来源于stack exchange,提问作者Daniel Cuellar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:05:06