繁体   English   中英

EF Core:如何查询 SQL 视图

[英]EF Core: How to query a SQL View

我的数据库中有一个名为“dbo.Viewtest”的 SQL 视图。 此视图组合了其他 2 个具有相同列类型的表的数据。 该视图还添加了一列以显示数据源自哪个表。

这是 SQL Server 对象资源管理器中 SQL 视图的样子:

dbo.ViewTest

身份证 | 类型 | 内容 | 地点

1 | H1 | 欢迎!|

2 | p | 登录 |

3 | h2 | 指南 |

1 | H1 | 信息 | 活动

2 | p | 关注 | 活动

该视图由 2 个表创建,其中一个称为“HomeContent”,另一个称为“EventsContent”(因此是位置列)。 使用以下代码创建了视图:

protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.Sql("CREATE VIEW ViewTest AS " +
                "SELECT Id, Type, Content, 'Home' location FROM HomeContent UNION ALL " +
                "SELECT Id, Type, Content, 'Evenementen' FROM EvenementenContent");

        }

然后我添加了一个模型类,如下所示:

  [Table("ViewTest")]
    public class TestViewContent
    {
        [Key]
        public int Id { get; set; }
        public string Type { get; set; }
        public string Content { get; set; }
        public string Location { get; set; }
    }

最后,我将它添加到我的 DbContext 中:

 public DbSet<TestViewContent> TestViewContent { get; set; }

现在,事情开始破裂了。 当我尝试使用 EF Core 显示此 SQL 视图时,我得到以下损坏的输出:

身份证 | 类型 | 内容 | 地点

1 | H1 | 欢迎!|

2 | p | 登录 |

3 | h2 | 指南 |

1 | H1 | 欢迎 |

2 | p | 登录 |

如您所见,无论出于何种原因,当我尝试显示 SQL 视图时,当应该显示“事件”表中的数据时,数据会“循环”。 因此,无论出于何种原因,它只显示主表中的数据。

我用于显示 SQL 视图的代码是:

 private readonly DbApplicationContext_context;

        public TestViewContentController(DbApplicationContext_context)
        {
            _context = context;
        }

   public async Task<IActionResult> Index()
        {
            return View(await _context.TestViewContent.ToListAsync());
        }

有没有人可以帮助我? 如果无法显示 SQL 视图,有没有人知道组合多个表并添加“位置”列以跟踪数据来源的表的更好方法? 任何帮助将不胜感激!

发生这种情况是因为您将[Key]放在Id属性上,但在组合两个表时,您的VIEWId列中生成重复值。 然后 EF Core 可能会“啊,又是Id =1,我已经有了那行,所以我会重用它”。

有三种可能的修复方法:

(1)为保证生成唯一值的 VIEW 定义一个单独的列,然后在 EF Core 中使用该列作为[Key]

要么

(2)保持 VIEW 原样,然后在 EF Core 中定义一个复合主键 请注意,EF Core 不支持使用[Key]属性创建复合键,您需要使用 Fluent API HasKey()函数,在这种情况下用于LocationId属性。

要么

(3)完全省略[Key] ,您可能实际上并不需要它,如此处的文档中所述: Keyless Entity Types

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM