首页 > 解决方案 > 具有现有数据库视图的实体框架代码优先

问题描述

我的团队正在使用 Entity Framework Code First 开始一个新项目。我们有一个新的、空的项目数据库;架构将通过 Code First 迁移进行管理。

但是,我们需要访问一个位于外部数据库(由不同项目管理)中的数据。我们可以通过我们自己的数据库中的视图访问这些数据,该视图映射到外部数据库中的表。

由于这种设置,我们有两个相互竞争的要求:

  1. 创建迁移时,实体框架不应尝试创建或编辑视图。
  2. 在运行时,我们应该仍然能够使用实体框架通过视图查询/插入/更新/删除数据,就好像它是一个常规表一样。

我们已经查看了[NotMapped]属性和.Ignore()方法,但两者似乎都只满足上述两个要求之一。

这种配置是否可以使用实体框架代码优先,还是我们需要切换到数据库优先?

我们使用的是 Entity Framework Core 2.1.1 版。

标签: c#databaseentity-frameworkmigrationentity-framework-core

解决方案


没有同时满足这两个要求的配置,而且我看不出 Database First(或 Code Second)有什么帮助,因为问题在于迁移,而不是映射。

[Table]通过将视图映射为表(通常是数据注释或流ToTable式 API),可以轻松满足要求 #2 。对于 EF CRUD 操作,具有该名称的实际 db 对象是表还是视图并不重要,只要它支持相应的 SQL 命令。

上述解决方案无法满足要求 #1,但可以轻松解决。由于 EF Core 需要预先创建的代码迁移(没有像 EF6 这样的自动迁移),您可以手动编辑包含CreateTablein Up/ DropTablein的迁移Down并简单地删除它们。

实际上还有一个基于自定义 MigrationSqlGenerator的解决方案,但它更复杂,不值得仅仅为单个视图付出努力。


推荐阅读