EF Database First模式下创建数据库时视图转为表的解决求助
解决EF Database First下还原数据库视图、函数等结构的问题
问题根源
Database.Create()方法仅会根据EDMX生成的实体类创建数据库表,无法区分实体类源自表还是视图,因此会将视图对应的实体类创建为表。要完整还原视图、函数、存储过程等结构,需通过手动执行DDL脚本或EF迁移来实现。
方法一:手动执行DDL脚本
先通过Database.Create()创建表,再执行原数据库中视图、函数等的DDL脚本:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Using createdb As New Model1 ' 创建数据库及表结构 createdb.Database.Create() ' 执行视图创建脚本(替换为你的实际视图DDL) Dim viewSql As String = "CREATE VIEW [dbo].[YourTargetView] AS SELECT Column1, Column2 FROM [dbo].[SourceTable]" createdb.Database.ExecuteSqlCommand(viewSql) ' 执行标量函数创建脚本(替换为你的实际函数DDL) Dim functionSql As String = "CREATE FUNCTION [dbo].[CalculateValue](@Input INT) RETURNS INT AS BEGIN RETURN @Input * 2 END" createdb.Database.ExecuteSqlCommand(functionSql) ' 同理添加存储过程等其他对象的DDL脚本 End Using End Sub
方法二:使用EF迁移管理全量结构
通过迁移可以统一管理表、视图、函数等所有数据库对象的创建:
- 在Package Manager Console中执行:
Enable-Migrations Add-Migration InitialCreate - 打开生成的迁移文件(位于
Migrations目录下),在Up方法中手动添加视图、函数的创建语句:Public Overrides Sub Up() ' 自动生成的表创建语句 CreateTable( "dbo.SourceTable", Function(c) New With { .Column1 = c.Int(nullable := False, identity := True), .Column2 = c.String(maxLength := 50) }) _ .PrimaryKey(Function(t) t.Column1) ' 手动添加视图创建SQL Sql("CREATE VIEW [dbo].[YourTargetView] AS SELECT Column1, Column2 FROM [dbo].[SourceTable]") ' 手动添加函数创建SQL Sql("CREATE FUNCTION [dbo].[CalculateValue](@Input INT) RETURNS INT AS BEGIN RETURN @Input * 2 END") End Sub - 修改代码使用迁移创建数据库:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Using createdb As New Model1 ' 应用迁移,创建所有数据库对象 createdb.Database.Migrate() End Using End Sub
注意事项
- 导出原数据库的DDL脚本时,可通过SQL Server Management Studio(SSMS)的"生成脚本"功能,选择仅导出视图、函数等非表对象。
- 若后续数据库结构变更,需更新迁移文件并重新执行
Update-Database或Database.Migrate()。
内容的提问来源于stack exchange,提问作者ABDULAZIZ DHAW
相关产品推荐
相关产品推荐

