我有一个代码优先的实体框架上下文,需要同时支持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期间有没有办法询问当前的数据库连接?我还可以使用其他钩子吗?
答案 0 :(得分:0)
为了未来读者的利益,我最终通过使用共享接口为同一组创建两个数据上下文,为我自己的用例(支持SQL Server和Oracle)解决了这个问题。实体 - 一个用于SQL Server,一个用于Oracle - 检测连接字符串上的ProviderName,并在运行时注入适当的上下文。
这不仅可以让我使用数据库特定的行为维护两组迁移,还可以让我更好地支持,例如我们的Oracle开发人员要求的命名约定,而不是将这些约定强加于我们的SQL Server部署。