C# 是否可以在EntityFramework核心版本2.1上自动映射DB视图?
我找到了关于映射视图并在EF Core中使用它的方法。C# 是否可以在EntityFramework核心版本2.1上自动映射DB视图?,c#,asp.net-core,entity-framework-core,asp.net-core-2.1,C#,Asp.net Core,Entity Framework Core,Asp.net Core 2.1,我找到了关于映射视图并在EF Core中使用它的方法。 根据,以前的EF核心版本无法自动映射视图 但是现在呢?据报道, EF核心模型现在可以包含查询类型。与实体类型不同, 查询类型没有定义键,因此无法插入, 已删除或更新(即只读),但可以返回 直接通过查询。查询类型的一些使用场景包括: 映射到没有主键的视图 (……) 所以问题是:是否有可能自动构建数据库上下文并映射其视图(就像我们对现有数据库所做的那样)?如果是,有人知道怎么做吗 或者唯一的方法仍然是Sampath Kaliyamurthy
根据,以前的EF核心版本无法自动映射视图 但是现在呢?据报道, EF核心模型现在可以包含查询类型。与实体类型不同,
查询类型没有定义键,因此无法插入,
已删除或更新(即只读),但可以返回
直接通过查询。查询类型的一些使用场景包括:
- 映射到没有主键的视图
- (……)
select*into table from view
query从该视图创建一个表,并将其命名为视图的初始名称(例如,该表将命名为“MyView”)HasKey
属性当然,唯一的区别是您将无法在其中插入数据或编辑数据
但是这没关系,因为如果您想使用视图,您从一开始就知道这一点
但是这个问题还是开了… …尽管有这种解决方法,我仍然想知道是否有更“直接”和“2.1-native”的东西,如他们在路线图中所说的,在ef 2.1中引入 因此,任何帮助和/或回答都将是非常感谢的 可以构建视图。只需按照构建表的方式使用-Tables,只需使用视图的名称即可。例如,如果视图的名称为“vw_inventory”,则在Package Manager控制台中运行此命令(将您自己的信息替换为“My…”): 此命令将在项目的临时目录中创建模型文件和上下文文件。您可以将模型文件移动到模型目录中(记住更改名称空间名称)。您可以从上下文文件中复制所需内容,并将其粘贴到项目中适当的现有上下文文件中 注意:如果要在使用本地db的集成测试中使用视图,则需要在db设置中创建视图。如果要在多个测试中使用该视图,请确保添加对该视图存在性的检查。在这种情况下,由于SQL“Create View”语句必须是批处理中的唯一语句,因此需要在EXISTION check语句中以动态SQL的形式运行Create View。或者,您可以运行单独的“if exists drop view…”语句,然后运行“create view”语句,但是如果多个测试同时运行,您不希望在另一个测试正在使用该视图时删除该视图。 例如:
这是一个有用的链接。它描述了手动添加代码节而不是搭建代码节:您尝试过做这些事情吗?@Brad是的,但是视图不会自动映射。我有一个解决方案,包括重命名视图,从该视图创建一个表,构建数据库,然后删除表并重命名视图,但我想知道是否有更“直接”和“2.1-native”的解决方案(我将把这个解决方案作为编辑添加到问题中)当然,EF Core 2.1添加了可使用
ToView
fluent API映射到db视图的功能。我不知道是否有脚手架支持。@IvanStoev谢谢你提供的信息,我不知道!我不认为脚手架支持它,我会尽快给你一个尝试,我会告诉你!如果您有多个视图,这将是大量的工作!更不用说,每次对数据库进行更改并希望再次构建数据库时,都必须经历这个过程。我一直使用的解决方法是视图的部分类。仍然不理想,但再次搭建脚手架后几乎不需要工作。我自己也在寻找更好的解决方案。你好@Naner,谢谢你的评论!请随意留下这个问题的答案,解释你会发现最合适的解决方案/解决方法,因为这个问题中的观点越来越多,我认为这对很多人都很有用
PM> Scaffold-DbContext "Server=MyServer;Database=MyDatabase;user id=MyUserId;password=MyPassword" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Temp -Tables vw_inventory
void setupDb() {
...
SomeDb.Command(db => db.Database.ExecuteSqlRaw(CreateInventoryView()));
...
}
public string CreateInventoryView() => @"
IF OBJECT_ID('[dbo].[vw_inventory]') IS NULL
BEGIN EXEC('CREATE VIEW [dbo].[vw_inventory] AS
SELECT ...')
END";