我一直在使用这样的连接字符串将我的网站连接到我的数据库:
<add name="MyDb"
connectionString="Data Source=MyDb;
Initial Catalog=Staging;
User Id=website_staging;
Password=secret;"
providerName="System.Data.SqlClient" />
website_staging
用户是 db_ddladmin
角色的成员,因此当我发布并且我的 MigrateDatabaseToLatestVersion
初始化程序运行时,它具有权限需要将数据库自动迁移到最新版本。
我想减少标准用户的权限(通过仅将其添加到 db_datareader
和 db_datawriter
角色)并与不同的用户连接(在 db_ddladmin 中)
角色)在迁移过程中。
所以我添加了另一个具有不同名称和用户的连接字符串:
<add name="Migrations"
connectionString="Data Source=MyDb;
Initial Catalog=Staging;
User Id=website_staging_migrations;
Password=secret;"
providerName="System.Data.SqlClient" />
并且我更改了在我的 DatabaseMigrationConfig
类中初始化的上下文所使用的连接字符串的名称:
public class DatabaseMigrationConfig
{
internal static void Register()
{
using (var context = new MyDbContext(Name="Migrations"))
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext,
Migrations.Configuration>());
context.Database.Initialize(false);
}
}
}
在我的 Migrations.Configuration
类的构造函数中,我还更改了连接字符串:
internal sealed class Configuration : DbMigrationsConfiguration<SID2013Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
string cs = ConfigurationManager.ConnectionStrings["Migrations"].ConnectionString;
TargetDatabase = new DbConnectionInfo(cs, "System.Data.SqlClient");
}
}
然后我尝试发布该网站。它似乎正确选择了具有较高权限的连接字符串,但它尝试运行初始
迁移。我怎样才能阻止它这样做?
最佳答案
我最终通过将 website_staging_migrations
用户添加到 db_datareader
和 db_datawriter
角色以及 db_ddladmin
解决了这个问题> 角色。
用户显然需要读取__MigrationHistory
表中的数据。让我困惑的是 EF 不会将访问表失败报告为错误,而是在尝试运行初始迁移时收到此错误:
There is already an object named '----' in the database.
并且用户还需要写入__MigrationHistory
表。在将用户添加到 db_datawriter
角色之前,我收到此错误:
The INSERT permission was denied on the object '__MigrationHistory',
database 'Staging', schema 'dbo'.
关于entity-framework - 如何使用不同的连接字符串(但相同的数据库)进行迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342172/