繁体   English   中英

Scaffold-DbContext SQL 视图? ASP 网络核心 3.1

[英]Scaffold-DbContext SQL Views ? ASP NET CORE 3.1

我需要你的帮助。 我在网上读到,从来没有一种正确的方法可以将 sql 中的视图导入到我们的 asp.net 核心项目中。 你知道在 3.1 版本中你能不能做到? 如果是这样,如何? 对于表,我使用“scaffold-DbContext”命令。 非常感谢!

尽管您不能将 scaffold-DbContext 用于数据库视图,但您仍然可以在 .Net Core 项目中使用 SQL 视图。

假设您有以下 SQL 视图

CREATE VIEW [dbo].[v_MyTableResult] AS

SELECT 
    SELECT Id, Name FROM MyTable

GO

根据 SQL View 的结果集创建一个新的 Model 类。

public class MyTableModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在数据库上下文类中,为模型引入属性。

public virtual DbSet<MyTableModel> MyTableResults { get; set; }

在 OnModelCreating 方法中,配置模型属性

    modelBuilder.Entity<MyTableModel>(entity =>
    {
        entity.HasNoKey();

        entity.Property(e => e.Id)
            .HasColumnName("Id");

        entity.Property(e => e.Name)
            .HasColumnName("Name");
    });

最后,在需要视图结果的方法中,在 DbSet 属性上调用 FromSqlRaw

    var myTableResults =
        this.MyDbContext.MyTableResults.FromSqlRaw(
            "SELECT * FROM dbo.v_MyTableResult").ToList();

好像还不支持。 有关解决方法,您可以参考

是否可以在 Entity Framework Core 2.1 版上自动映射数据库视图?

可能的脚手架视图。 只需像搭建表一样使用 -Tables,只使用视图的名称。 例如,如果您的视图名称是“vw_inventory”,则在包管理器控制台中运行此命令(将您自己的信息替换为“我的...”):

PM> Scaffold-DbContext "Server=MyServer;Database=MyDatabase;user id=MyUserId;password=MyPassword" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Temp -Tables vw_inventory

此命令将在项目的 Temp 目录中创建模型文件和上下文文件。 您可以将模型文件移动到您的模型目录中(记得更改命名空间名称)。 您可以从上下文文件中复制您需要的内容并将其粘贴到项目中相应的现有上下文文件中。

注意:如果您想在使用本地数据库的集成测试中使用您的视图,您需要将视图创建为数据库设置的一部分。 如果您要在多个测试中使用该视图,请确保添加对视图存在的检查。 在这种情况下,由于 SQL 'Create View' 语句需要是批处理中的唯一语句,因此您需要在存在检查语句中将创建视图作为动态 Sql 运行。 或者,您可以运行单独的“如果存在删除视图...”,然后运行“创建视图”语句,但如果多个测试同时运行,您不希望在另一个测试正在使用视图时删除该视图。 例子:

  void setupDb() {
    ...
    SomeDb.Command(db => db.Database.ExecuteSqlRaw(CreateInventoryView()));
    ...
  }
  public string CreateInventoryView() => @"
  IF OBJECT_ID('[dbo].[vw_inventory]') IS NULL
    BEGIN EXEC('CREATE VIEW [dbo].[vw_inventory] AS
       SELECT ...')
    END";

这是一个有用的链接。 它描述了手动添加代码部分(如 Nouman 提到的)而不是搭建它们: https ://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=fluent-api

是的,我们可以将scaffold-DbContext 与 view 一起使用

使用 scaffold-DbContext 进行数据库视图 (myview)。 我在脚手架-DbContext 查询下执行。

Scaffold-DbContext“数据源=my_server,1433;初始目录=my_database;用户ID=my_user;密码=my_password;” Microsoft.EntityFrameworkCore.SqlServer -o 实体 -Context ContextName -t myview -f

执行后,您将获得实体类和上下文文件。

实体类 (myview.cs) 中的代码

////// Fetching data
public partial class myview
{ 
    public Guid property_1 { get; set; }
    
}

dbcontect 文件(ContextName.cs) 中的代码

public partial class ContextName : DbContext
{
    public virtual DbSet<myview> myview { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<myview>(entity =>
        {
            entity.HasNoKey();

            entity.ToView("myview", "ExtIntDWFS");

            ////// other property configuration.
        }
    }
}

控制器中获取视图数据的代码

////// Fetching data
public async Task<myview> GetView(Base @base)
    {
        myview obj = new myview();

        using (ContextName context = new ContextName())
        {
            obj = await context.myview.Select(s => new myview
                                              {
                                                  property_1 = s.property_1,
                                              }).FirstOrDefaultAsync();
        }

        return obj;
    }

上面的代码成功地为我工作。

我最近有一个类似的需求(检索一个或多个视图并在 .NET 项目中创建相应的类)。 可以使用Scaffold-DbContect来完成,例如:

Scaffold-DbContext "Server=<address>;
Database=<dbname>;
Trusted_Connection=True" 
Microsoft.EntityFrameworkCore.SqlServer -OutputDir
ModelDirectory -t <table_name> -t <view_name>

它创建一个名为OutputDir的文件夹, OutputDir包含指定表或视图的相应类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM