如何使用 Entity Framework 4 Code-First 定义数据库视图?

Posted

技术标签:

【中文标题】如何使用 Entity Framework 4 Code-First 定义数据库视图?【英文标题】:How do I define a database view using Entity Framework 4 Code-First? 【发布时间】:2011-05-04 21:09:13 【问题描述】:

我在任何地方都找不到关于此的任何信息!

【问题讨论】:

【参考方案1】:

这是因为您无法使用代码优先的方法定义数据库视图。数据库视图是在现有表/函数之上使用 SQL 查询的数据库结构。你不能先用代码定义这样的结构。

如果您想要查看,您必须通过执行CREATE VIEW SQL 脚本手动创建它,例如在自定义初始化程序中 - 它类似于this answer。请注意,如果您想将实体映射到视图,这对您没有帮助。在这种情况下,您可能必须首先删除由 EF 创建的表并创建具有相同名称的视图(我没有尝试过,但它可以解决问题)。另请注意,并非每个视图都是 udpatable,因此您很可能会获得只读实体。

【讨论】:

是的,你是对的。事实上,我已经意识到在代码中定义视图并没有多大意义。 :) 我在使用EF建库时,在项目的初始化程序中实现了“删除表并添加视图”。不是很有趣,但它确实有效。这会让你在哪里迁移是一个悬而未决的问题。我正在继续寻找一种更简洁的方法来告诉 EF Code First not 生成特定表。 @Ladislav 这就是为什么这个新的 EF 代码优先框架只有在您的应用程序不复杂并且除了内部数据之外不做任何事情的情况下才可行。如果应用程序确实做了某些事情 - 您将不得不坚持使用 EDMX 或您选择的其他一些 ORM 系统。 EDMX Model First 并没有比 imo 更好,因为如果您导入视图,当您“从模型生成数据库”时会得到一个表。同样的问题。两者都需要一个正式的视图与表格概念。【参考方案2】:

要创建模型,然后在初始化程序中运行 SQL 语句以使用第一行代码直接针对上下文创建视图,然后在上下文中覆盖 OnModelCreating 并运行第二行忽略模型的代码。

context.Database.ExecuteSqlCommand(Resources.<resourcename>);

modelBuilder.Ignore<modeltype>();

【讨论】:

这很有效,我喜欢它,因为它消除了删除 EF 创建的表的需要。但需要注意的是,这种方式不能在 EF 模型中使用视图。 @StephanKeller 没错,但由于 EF 代码优先方法的局限性,最后我不得不回到老式的 EDMX。老实说,如果您的应用程序执行任何操作,您将无法使用 EF 代码优先方法。但最终这不应该那么令人惊讶,因为自动化只能走这么远。所以+1。

以上是关于如何使用 Entity Framework 4 Code-First 定义数据库视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Entity Framework 4.4 中实现 DBSet.AddOrUpdate?

如何在 n 层分层应用程序中使用 Entity Framework(4) 编译查询?

使用 Entity Framework Migrations 4.3 时如何显式命名数据库

如何将 Entity Framework 4.1 与 MVC 3 登录一起使用

如何使用 Entity Framework 4 Code-First 定义数据库视图?

我的项目中安装了哪个版本的Entity Framework?