You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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迁移管理全量结构

通过迁移可以统一管理表、视图、函数等所有数据库对象的创建:

  1. 在Package Manager Console中执行:
    Enable-Migrations
    Add-Migration InitialCreate
    
  2. 打开生成的迁移文件(位于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
    
  3. 修改代码使用迁移创建数据库:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:32:32