ASP.NET EntityFramework 获取数据库名称

60

我使用以下教程创建了一个使用MySQL的ASP.NET EF应用程序:http://www.asp.net/identity/overview/getting-started/aspnet-identity-using-mysql-storage-with-an-entityframework-mysql-provider 它可以工作,但我不喜欢在MySqlInitializer类中硬编码设置我的数据库名称 - 在下面的片段中称为myDatabaseName

var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
        string.Format(
          "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",
          "myDatabaseName"));

我正在寻找一种动态获取DbContext数据库名称的方法,以便我仅在连接字符串中存储数据库名称,而不是在MySqlInitializer中再次存储。但我无法找到任何名称的属性,无论是在DbContext还是在DbContext的Database-attribute中。

2个回答

89

对于使用EF Core的人,可以尝试以下替代方法:

var databaseName = context.Database.GetDbConnection().Database

这不符合 EF Core 5.0 的最新版本。 - DMX David Cardinal
@DMXDavidCardinal,EF Core 5.0 有哪些变化? - johnny 5
1
我从未使用过以前的版本,因此无法进行有效比较,但是 DbContext.Database 属性的类型为 DatabaseFacade,它不包含方法 GetDbConnection()。现在,SQL 连接是在受保护的 OnConfiguring 方法中使用 DbContextOptionsBuilder 定义的。然而,这个 optionsBuilder 似乎无法在 DbContext 类之外访问。 - DMX David Cardinal
1
@DMXDavidCardinal 这并不包括该方法,因为它是一个扩展方法。请参阅MSDN文档 - johnny 5
啊!谢谢!我认为这听起来很相关,可以添加到解决方案中。 - DMX David Cardinal
请确保您已经使用了 using Microsoft.EntityFrameworkCore;,否则您将无法使用 GetDbConnection() 方法。 - ADM-IT

62

这应该能够为您完成工作(适用于 .NET 6 及以下版本)

string databaseName = context.Database.Connection.Database;

4
不再与.NET 7.0兼容。 - Marcel Melzig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接