EF Core:如何查询 SQL 视图

EF Core: How to query a SQL View

我的数据库中有一个名为 'dbo.Viewtest' 的 SQL 视图。此视图结合了其他 2 个 table 的数据,它们具有相同的列类型。该视图还添加了一列以显示 table 数据的来源。

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

dbo.ViewTest

编号 |类型 |内容 |地点

1 | h1 |欢迎!|主页

2 | p |登录 |主页

3 | h2 |指南 |主页

1 | h1 |资讯 |活动

2 | p |关注 |活动

此视图是从 2 table 秒创建的,其中一个称为 '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");

        }

然后我添加了一个模型Class如下:

  [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 视图时,数据 'loops-around' 而来自 'Events' table 的数据应该展示。因此,无论出于何种原因,它只显示来自家庭 table.

的数据

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

 private readonly DbApplicationContext_context;

        public TestViewContentController(DbApplicationContext_context)
        {
            _context = context;
        }

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

这里有人可以帮助我吗?如果无法显示 SQL-Views,有没有人知道更好的方法来组合多个 tables 并添加一个 'Location' 列来跟踪 table数据来自哪里?任何帮助将不胜感激!

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

存在三种可能的修复方法:

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

(2)保持VIEW原样,然后在EF Core中定义一个复合主键。请注意,EF Core 不支持使用 [Key] 属性创建复合键,您需要 use the Fluent API HasKey() function,在本例中为 LocationId 属性。

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