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

如何使用Entity Framework获取SQL Server实例中的数据库名称列表?

用Entity Framework获取SQL Server数据库列表的实现方案

没问题!作为EF新手,完全可以用Entity Framework来替代原生SqlCommand实现这个需求,而且用法更贴合EF的设计思路。下面分EF6和EF Core两种主流版本给你详细说明:

一、EF6 实现方式

EF6支持直接通过Database.SqlQuery执行原生SQL,并映射到简单实体类:

  1. 先定义一个用于接收查询结果的实体类(只需要和查询列对应即可):
public class DatabaseName
{
    public string Name { get; set; }
}
  1. 编写EF查询方法:
public static string[] GetDatabaseNamesUsingEF6(string masterConnectionString)
{
    // 创建指向master库的DbContext(用你的连接字符串初始化)
    using (var context = new DbContext(masterConnectionString))
    {
        // 执行原生SQL并映射到实体,最后提取名称数组
        var databaseNames = context.Database.SqlQuery<DatabaseName>("SELECT name AS Name FROM sysdatabases")
                                            .Select(db => db.Name)
                                            .ToArray();
        return databaseNames;
    }
}

二、EF Core 实现方式

EF Core的API略有不同,如果你用的是EF Core 5.0及以上版本,甚至可以直接查询字符串类型,不需要额外定义实体类:

方式1:无需实体类(EF Core 5.0+)

public static string[] GetDatabaseNamesUsingEFCore(string masterConnectionString)
{
    // 构建指向master库的DbContext
    var options = new DbContextOptionsBuilder<DbContext>()
                    .UseSqlServer(masterConnectionString)
                    .Options;

    using (var context = new DbContext(options))
    {
        // 直接查询字符串类型的结果
        var databaseNames = context.Database.SqlQuery<string>("SELECT name FROM sysdatabases")
                                            .ToArray();
        return databaseNames;
    }
}

方式2:使用实体类(兼容所有EF Core版本)

如果你的EF Core版本较低,或者需要扩展更多数据库属性,可以用实体类映射:

public class DatabaseName
{
    public string Name { get; set; }
}

public static string[] GetDatabaseNamesUsingEFCore(string masterConnectionString)
{
    var options = new DbContextOptionsBuilder<DbContext>()
                    .UseSqlServer(masterConnectionString)
                    .Options;

    using (var context = new DbContext(options))
    {
        var databaseNames = context.Set<DatabaseName>()
                                   .FromSqlRaw("SELECT name AS Name FROM sysdatabases")
                                   .Select(db => db.Name)
                                   .ToArray();
        return databaseNames;
    }
}

关键注意事项

  • 确保连接字符串指向master数据库,因为sysdatabases是master库中的系统视图。
  • 始终用using语句包裹DbContext,确保上下文被正确释放,这是EF的最佳实践。
  • 对比你原来的原生SqlCommand写法,EF的优势在于可以轻松扩展实体类(比如添加CreateDate等字段),后续如果需要获取更多数据库元数据,会更灵活。

内容的提问来源于stack exchange,提问作者Cleve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:23:53