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
属性 上,但是当将两者组合时,您的 VIEW
在 Id
列中产生重复值表。 EF Core 然后可能会出现“啊,又是 Id
=1,我已经有了那行,所以我会重用它”。
存在三种可能的修复方法:
(1) 为保证生成 唯一值 的 VIEW 定义一个单独的列,然后在 EF 中使用该列核心为[Key]
.
或
(2)保持VIEW原样,然后在EF Core中定义一个复合主键。请注意,EF Core 不支持使用 [Key]
属性创建复合键,您需要 use the Fluent API HasKey()
function,在本例中为 Location
和 Id
属性。
或
(3) 完全省略 [Key]
,您可能实际上不需要它,如文档中所述:Keyless Entity Types.
我的数据库中有一个名为 '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
属性 上,但是当将两者组合时,您的 VIEW
在 Id
列中产生重复值表。 EF Core 然后可能会出现“啊,又是 Id
=1,我已经有了那行,所以我会重用它”。
存在三种可能的修复方法:
(1) 为保证生成 唯一值 的 VIEW 定义一个单独的列,然后在 EF 中使用该列核心为[Key]
.
或
(2)保持VIEW原样,然后在EF Core中定义一个复合主键。请注意,EF Core 不支持使用 [Key]
属性创建复合键,您需要 use the Fluent API HasKey()
function,在本例中为 Location
和 Id
属性。
或
(3) 完全省略 [Key]
,您可能实际上不需要它,如文档中所述:Keyless Entity Types.