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

Ian*_*ton 18 ef-code-first entity-framework-4.1

如何使用Entity Framework 4 Code-First定义数据库视图?我在任何地方都找不到任何相关的东西!

Lad*_*nka 17

那是因为您无法使用代码优先方法定义数据库视图.数据库视图是数据库构造,它在现有表/函数之上使用SQL Query.您不能首先使用代码定义此类构造.

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

  • 我在使用 EF 构建数据库时,在项目的初始值设定项中实现了“删除表并添加视图”。不是很有趣,但它确实有效。这会让您留下迁移是一个悬而未决的问题。我正在继续寻找一种更简洁的方法来告诉 EF Code First *不要* 生成特定的表。 (2认同)
  • @Ladislav这就是为什么这个新的EF代码优先框架只有在你的应用程序没有复杂性且除了内部数据之外什么都不做的情况下才可行.如果应用程序实际上做了某些事情 - 您将不得不坚持使用EDMX或您选择的其他ORM系统. (2认同)

Mik*_*oud 14

要创建模型,然后在初始化程序中运行SQL语句以使用第一行代码直接创建视图,然后在上下文中重写OnModelCreating并运行第二行代码以忽略该模型.

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

modelBuilder.Ignore<modeltype>();
Run Code Online (Sandbox Code Playgroud)

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