在DbMigraiton期间访问当前数据库Connection对象

时间:2017-06-13 15:15:12

标签: c# entity-framework entity-framework-6

我有一个代码优先的实体框架上下文,需要同时支持SQL Server和Oracle。

模型本身相当简单,除了我想用触发器解决SQL Server中多个CASCADE DELETE路径的问题。

我可以使用SQL上的DbMigration方法创建触发器,但是如果我迁移的数据库实际上是SQL Server,我只想创建触发器数据库中。

我想做以下事情: -

public override void Up()
{

  ...

  if (this.Database.Connection.ProviderName == "System.Data.SqlClient")
  {
    this.CreateTable(...); // Create the table without CASCADE DELETE

    this.Sql(...); // Create the trigger
  }
  else if (this.Database.Connection.ProviderName == "Oracle.ManagedDataAccess.Client")
  {
    this.CreateTable(...); // Create the table with CASCADE DELETE
  }

  ...
}

我的问题是DbMigration基类似乎没有提供任何钩子来询问当前的数据库连接。

我无法通过ConfigurationManager.ConnectionStrings查询.config文件,因为在使用例如{I}时,我可能会覆盖连接字符串Update-Database cmdlet。

在DbMigration期间有没有办法询问当前的数据库连接?我还可以使用其他钩子吗?

1 个答案:

答案 0 :(得分:0)

为了未来读者的利益,我最终通过使用共享接口为同一组创建两个数据上下文,为我自己的用例(支持SQL Server和Oracle)解决了这个问题。实体 - 一个用于SQL Server,一个用于Oracle - 检测连接字符串上的ProviderName,并在运行时注入适当的上下文。

这不仅可以让我使用数据库特定的行为维护两组迁移,还可以让我更好地支持,例如我们的Oracle开发人员要求的命名约定,而不是将这些约定强加于我们的SQL Server部署。