如何在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
相关产品推荐
相关产品推荐

