我的团队将首先使用实体框架代码启动一个新项目。我们为项目创建了一个新的空数据库;架构将通过代码优先迁移进行管理。
但是,我们需要访问一个外部数据库(由另一个项目管理)中的一段数据。我们可以通过自己数据库中映射到外部数据库表的视图访问这些数据。
由于这种设置,我们有两个相互竞争的要求:
创建迁移时,实体框架不应尝试创建或编辑视图。
在运行时,我们应该仍然能够使用实体框架通过视图查询/插入/更新/删除数据,就像它是一个常规表一样。
我们已经研究了[NotMapped]
属性和.Ignore()
方法,但它们似乎都只满足上面两个需求中的一个。
这种配置是可以先使用实体框架代码,还是需要先切换到数据库?
我们使用的是实体框架核心版本2.1.1。
最佳答案
没有同时满足这两个需求的配置,我看不出数据库优先(或代码第二)有什么帮助,因为问题是迁移,而不是映射。
通过将视图映射为表(通常,[Table]
数据注释或ToTable
fluent api),可以轻松满足需求2。对于ef crud操作,只要它支持相应的sql命令,那么实际具有该名称的db对象是表还是视图就无关紧要了。
上述解决方案不能满足要求1,但很容易解决。由于ef core需要预先创建的代码迁移(没有像ef6这样的自动迁移),您可以手动编辑在CreateTable
/Up
中包含DropTable
的迁移,并简单地删除它们。
实际上,还有一个基于custom MigrationSqlGenerator的解决方案,但它更复杂,不值得只为一个视图付出努力。