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

如何在EF Core 7中访问SQL Server系统视图sys.database_firewall_rules

实现方案

可以在EF Core 7中创建实体类映射到SQL Server的sys.database_firewall_rules系统视图,添加为DbSet并配置为只读,具体步骤如下:

1. 创建防火墙规则实体类

根据sys.database_firewall_rules的列定义,创建对应实体类,指定主键(EF Core要求实体必须包含主键,这里使用视图中的firewall_rule_id):

public class FirewallRule
{
    public Guid FirewallRuleId { get; set; }
    public string Name { get; set; }
    public string StartIpAddress { get; set; }
    public string EndIpAddress { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime? ModifyDate { get; set; }
}

2. 在DbContext中配置视图映射

在DbContext的OnModelCreating方法里,将实体映射到系统视图,并配置为只读(阻止EF生成插入/更新/删除语句):

public class YourDbContext : DbContext
{
    public DbSet<FirewallRule> FirewallRules { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<FirewallRule>(entity =>
        {
            // 映射到目标系统视图
            entity.ToView("sys.database_firewall_rules");
            
            // 指定实体主键
            entity.HasKey(e => e.FirewallRuleId);
            
            // 显式映射列名(实体属性与视图列名一致时可省略,此处为清晰性保留)
            entity.Property(e => e.FirewallRuleId).HasColumnName("firewall_rule_id");
            entity.Property(e => e.Name).HasColumnName("name");
            entity.Property(e => e.StartIpAddress).HasColumnName("start_ip_address");
            entity.Property(e => e.EndIpAddress).HasColumnName("end_ip_address");
            entity.Property(e => e.CreateDate).HasColumnName("create_date");
            entity.Property(e => e.ModifyDate).HasColumnName("modify_date");
            
            // 配置只读:禁止EF生成写操作SQL
            entity.HasNoInsert();
            entity.HasNoUpdate();
            entity.HasNoDelete();
        });
    }

    // 此处添加DbContext构造函数及其他配置逻辑
}

3. 查询防火墙规则

配置完成后,即可像操作普通实体一样通过DbSet查询视图数据:

var existingRules = await dbContext.FirewallRules.ToListAsync();

4. 保留原有增删逻辑

由于系统视图不支持直接写操作,你之前用DbContext.Database.ExecuteSqlRawAsync()实现的增删逻辑可以继续使用,示例如下:

// 添加防火墙规则
await dbContext.Database.ExecuteSqlRawAsync(
    "EXEC sp_set_database_firewall_rule @name = {0}, @start_ip_address = {1}, @end_ip_address = {2}",
    ruleName, startIp, endIp);

// 删除防火墙规则
await dbContext.Database.ExecuteSqlRawAsync(
    "EXEC sp_delete_database_firewall_rule @name = {0}",
    ruleName);

这种方式既可以通过EF Core的DbSet便捷查询系统视图数据,又能保留已验证可行的增删操作逻辑,无需升级到EF Core 8。

内容的提问来源于stack exchange,提问作者Nur Nedim Okatan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:23:19